using System;
using Unity.Mathematics;
using UnityEngine;

namespace Gyvr.Mythril2D
{
    [Serializable]
    public class TemporalRestoreStaminaEffect : ATemporalEffect
    {
        [Serializable]
        protected struct RestoreStaminaData
        {
            public int amount;
            public float interval;
            public bool delayFirstTick;
            [HideInInspector] public float timer;
        }

        [SerializeField] protected RestoreStaminaData m_restoreStaminaData;

        public override TermDefinition? info => GameManager.Config.GetTermDefinition("add_stamina_over_time");

        public override EEffectType GetEffectType() => EEffectType.Buff;

        protected override void OnInit()
        {
            m_restoreStaminaData.timer =
                m_restoreStaminaData.delayFirstTick ?
                m_restoreStaminaData.interval :
                0.0f;
        }

        protected override void OnUpdate()
        {
            m_restoreStaminaData.timer = math.max(0.0f, m_restoreStaminaData.timer - Time.deltaTime);

            if (m_restoreStaminaData.timer <= 0.0f)
            {
                m_restoreStaminaData.timer = m_restoreStaminaData.interval;
                m_effectData.target.instance.RecoverStamina(m_restoreStaminaData.amount, visualFlags);
            }
        }

        public override ITemporalEffect Clone()
        {
            return new TemporalRestoreStaminaEffect
            {
                m_effectData = m_effectData,
                m_temporalData = m_temporalData,
                m_restoreStaminaData = m_restoreStaminaData
            };
        }

        public override EffectDescription GenerateDescription()
        {
            var desc = base.GenerateDescription();
            desc.details = $"{m_restoreStaminaData.amount} {GameManager.Config.GetTermDefinition(EStat.Stamina).shortName}/{m_restoreStaminaData.interval:0.#}s";
            return desc;
        }
    }
}
