using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

[RequireComponent(typeof(PlayerMovement))]
public class PlayerController : MonoBehaviour
{
    public ParticleSystem clickArrows;
    public Interactable focus;

    public LayerMask movementMask;
    public LayerMask interactableMask;

    Camera cam;
    public PlayerMovement motor;

    Plane plane = new Plane(Vector3.down, 0);

    PhotonView photonView;

    Ray ray;
    RaycastHit hit;

    private void Awake()
    {
        cam = Camera.main;
        motor = GetComponent<PlayerMovement>();
        photonView = GetComponent<PhotonView>();
    }

    // Start is called before the first frame update
    void Start()
    {
        if (!photonView.IsMine) this.enabled = false;

        clickArrows.transform.SetParent(null);
    }

    // Update is called once per frame
    void Update()
    {
        if (EventSystem.current.IsPointerOverGameObject())
        {
            return;
        }

        if (Input.GetMouseButtonDown(0))
        {
            ray = cam.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit, 100f, movementMask))
            {
                clickArrows.transform.position = hit.point;
                clickArrows.Play();
            }
        }
        if (Input.GetMouseButton(0))
        {
            ray = cam.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit, 100f, movementMask))
            {
                motor.MoveToPoint(hit.point);

                //Debug.Log("hitpoint: " +  hit.point);
                RemoveFocus();
            }
            else
            {
                if (plane.Raycast(ray, out float distance))
                {
                    motor.MoveToPoint(ray.GetPoint(distance));
                    //Debug.Log("hitpoint: " + ray.GetPoint(distance));
                    RemoveFocus();
                }
            }
        }

        if (Input.GetMouseButton(1))
        {
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100f, interactableMask))
            {
                Interactable interactable = hit.collider.GetComponent<Interactable>();
                if (interactable != null)
                {
                    SetFocus(interactable);
                }
                // if we did, set as focus
            }
        }
    }

    private void SetFocus(Interactable newFocus)
    {
        if (newFocus != focus)
        {
            if (focus != null)
            {
                focus.OnDeFocus();
            }
            focus = newFocus;
            motor.FollowTarget(focus);
        }

        newFocus.OnFocused(transform, this);
    }

    public void RemoveFocus()
    {
        if (focus != null)
        {
            focus.OnDeFocus();
        }
        motor.StopFollowingTarget();
        focus = null;
    }
}
