using Kryz.CharacterStats.Examples;
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AbilityKeyBinder : MonoBehaviour
{
    [SerializeField] private BaseAbility ability;
    [SerializeField] private GameKey key;
    [SerializeField] private CastingStateController castingStateController;
    [SerializeField] private GameEvent_AbilityKeyBinder onAbilityKeyBinderSpawned;

    private PhotonView user;
    private Taggable userTag;
    private Mana mana;

    public BaseAbility Ability => ability;
    public GameKey GameKey => key;

    Coroutine currentChanneling;
    NetworkedChanneling networkedChanneling;
    AbilityBindInstance abilityBindInstance;

    private void Awake()
    {
        user = GetComponentInParent<PhotonView>();
        userTag = GetComponentInParent<Taggable>();
        mana = GetComponentInParent<Mana>();

    }

    private void Start()
    {
        if (!user.IsMine)
        {
            this.enabled = false;
            return;
        }

        onAbilityKeyBinderSpawned.Raise(this);
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(key.keyCode))
        {
            if (abilityBindInstance != null)
                abilityBindInstance.pressed.SetActive(true);
            if (mana.EnoughMana(ability.manaCost))
            {
                if(ability is ChanneledAbility)
                {
                    castingStateController.RequestAbilityChannel(ability, () => networkedChanneling = ((ChanneledAbility)ability).ExecuteChannel(user, userTag, ref currentChanneling));
                }
                else
                    castingStateController.RequestAbilityCast(ability, () => ability.Execute(user, userTag));
            }
        }
        if(Input.GetKeyUp(key.keyCode))
        {
            if (abilityBindInstance != null)
                abilityBindInstance.pressed.SetActive(false);
            if (currentChanneling != null)
            {
                StopCoroutine(currentChanneling);
                castingStateController.ResetChannelingCast();
                CastBarHandler.Instance.CancelChannelingOnButtonReleased();
            }

            if(networkedChanneling != null)
            {
                networkedChanneling.channeling = false;
                networkedChanneling.DisableVisuals();
            }
        }
    }

    public void SetupAbilityBindInstance(AbilityBindInstance abilityBindInstance)
    {
        this.abilityBindInstance = abilityBindInstance;
        mana.onResourceChanged.AddListener(OnManaChanged);
    }

    public void OnManaChanged(float currentMana)
    {
        abilityBindInstance.noMana.SetActive(!mana.EnoughMana(ability.manaCost));
    }
}
