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

public class CharacterAnimatorController : MonoBehaviour
{
    Animator anim;
    NavMeshAgent agent;
    PhotonView photonView;
    CharacterAnimatorParent parentController;


    SimpleRotationFX characterSpin;

    bool isCasting;
    bool wasSpinning = false;


    private void Awake()
    {
        anim = GetComponent<Animator>();
        agent = GetComponentInParent<NavMeshAgent>();
        photonView = GetComponentInParent<PhotonView>();
        parentController = GetComponentInParent<CharacterAnimatorParent>();
        characterSpin = photonView.GetComponentInChildren<SimpleRotationFX>();
    }

    // Start is called before the first frame update
    void Start()
    {
        if (!photonView.IsMine)
        {
            return;
        }
    }

    private void OnEnable()
    {
        parentController = GetComponentInParent<CharacterAnimatorParent>();
        Debug.Log("OnEnable: parentController is " + (parentController != null ? "not null" : "null"));

        if (photonView.IsMine)
        {
            CastBarHandler.Instance.OnCastingStateChanged.AddListener(UpdateIsCastingState);
            Debug.Log("Adding Listener for character: " + this.gameObject.name);
        }
    }
    private void OnDisable()
    {
        if (photonView.IsMine)
            CastBarHandler.Instance.OnCastingStateChanged.RemoveListener(UpdateIsCastingState);
    }

    // Update is called once per frame
    void Update()
    {
        if (!photonView.IsMine) return;

        anim.SetFloat("movementSpeed", agent.velocity.magnitude);
    }

    private void UpdateIsCastingState(bool isCasting)
    {
        this.isCasting = isCasting;
        if (isCasting)
        {
            anim.SetFloat("throwingTime", (1 / CastBarHandler.Instance.currentCastTime));
            SetTriggerBasedOnAbility(CastBarHandler.Instance.currentAbility.animationType, CastBarHandler.Instance.currentAbility.animationType == AbilityAnimationType.Spin);

            if (parentController == null)
            {
                parentController = GetComponentInParent<CharacterAnimatorParent>();
                Debug.Log("OnEnable: parentController is " + (parentController != null ? "not null" : "null"));
            }

            Debug.Log("NULL: " + parentController);

            parentController.SetRemoteTriggerBasedOnAbility((int)CastBarHandler.Instance.currentAbility.animationType);
        }
        else if (wasSpinning)
        {
            SetTriggerBasedOnAbility(AbilityAnimationType.Spin, false);
        }
    }

    public void OnAnimationEvent()
    {
        if (!photonView.IsMine) return;
        Debug.Log("$$melee Animation event");

        //if (!isCasting) return;

        Debug.Log("$$melee Animation event casting true");

        if (CastBarHandler.Instance.currentAbility.animationType == AbilityAnimationType.Melee)
        {
            CastBarHandler.Instance.ExecuteQueuedCastOnAnimationEvent();
            parentController.castingStateController.ResetCastingOnMeleeAnimationEvent();
        }
    }

    public void SetTriggerBasedOnAbility(AbilityAnimationType animationType, bool spinning = false)
    {
        switch (animationType)
        {
            case AbilityAnimationType.Throw:
                anim.SetTrigger("throw");
                break;
            case AbilityAnimationType.Spell:
                anim.SetTrigger("cast");
                break;
            case AbilityAnimationType.Melee:
                anim.SetTrigger("melee");
                break;
            case AbilityAnimationType.Spin:
                wasSpinning = spinning;
                anim.SetBool("spinning", spinning);
                if (characterSpin != null)
                    characterSpin.enabled = spinning;
                break;
            default:
                break;
        }
    }

}


public enum AbilityAnimationType
{
    Throw,
    Spell,
    Melee,
    Spin
}