using UnityEngine;

namespace AxibugEmuOnline.Client.InputDevices
{
    /// <summary>
    /// 输入设备的抽象控件接口
    /// </summary>
    public abstract class InputControl
    {
        /// <summary> 控件所属设备 </summary>
        public InputDevice Device { get; internal set; }

        /// <summary> 获取该控件是否在当前调用帧被激发 </summary>
        public bool Start { get; private set; }
        /// <summary> 获取该控件是否在当前调用帧被释放 </summary>
        public bool Release { get; private set; }

        bool m_performingLastFrame;
        /// <summary> 获取该控件是否在当前调用帧是否处于活动状态 </summary>
        public virtual bool Performing => Device.Resolver.CheckPerforming(this);

        /// <summary> 获得该控件的以二维向量表达的值 </summary>
        /// <returns></returns>
        public virtual Vector2 GetVector2() => Device.Resolver.GetVector2(this);
        /// <summary> 获得该控件的以浮点数表达的值 </summary>
        public virtual float GetFlaot() => Device.Resolver.GetFloat(this);

        internal void Update()
        {
            UpdateReleaseStartState();
            OnUpdate();
        }

        private void UpdateReleaseStartState()
        {
            var oldPerforming = m_performingLastFrame;
            var newPerforming = Performing;

            Start = false;
            Release = false;
            if (oldPerforming != newPerforming)
            {
                if (oldPerforming == false) Start = true;
                else Release = true;
            }
            m_performingLastFrame = Performing;
        }

        protected virtual void OnUpdate() { }

        /// <summary> 控件名,这个控件名称必须是唯一的 </summary>
        public abstract string ControlName { get; }

        internal InputControl(InputDevice device)
        {
            Device = device;
        }
    }
}