using XGame.Database;
using XGame.Framework.Components;
using XGame.Framework.Interfaces;
using XGame.Framework.Time;

namespace FL.Battle.Components
{
    public interface IStatesContext
    {
        IEntity Entity { get; }
        ITimeModule Time { get; }
        IAnimator Animator { get; }
        MoveComponent Move { get; }
        SkillComponent Skill { get; }
    }
    /// <summary>
    /// 状态组件
    /// </summary>
    public class StatesComponent : Component<IStatesContext>, IReset
    {
        private ITimer _deadTimer;
        protected override void OnDispose()
        {
            _deadTimer?.Cancel();
            _deadTimer = null;
        }
        public void AddState(EEntityState state)
        {
            var entity = Context.Entity;
            if (entity.IsDead)
            { // 已经死亡，不能再修改状态
                return;
            }
            if ((state & EEntityState.Dead) != 0)
            { // 死亡,先移除所有状态
                entity.RemoveState(EEntityState.All);
            }
            var isChanged = entity.AddState(state);
            if (entity.IsDead)
            {
                Context.Move.StopMove();
                Context.Animator.Play(EAnimationName.idle);
                Context.Skill.Stop(false);
                //TODO 死亡动作  停止所有组件
                _deadTimer = Context.Time.AddDelayTimer(500, () =>
                { // 死亡事件通知
                    _deadTimer = null;
                    EventSingle.Instance.Notify(EventDefine.GameMainMapRemoveEntity, entity.EntityId);
                });
            }
            else if (state is EEntityState.Dizzy or EEntityState.Freeze or EEntityState.Palsy)
            {
                Context.Move.Pause();
                Context.Skill.Pause(state);
                var animation = EAnimationName.palsy;
                if (isChanged)
                { // 动作显示优先级: Dizzy > Freeze > palsy
                    if (state is EEntityState.Dizzy || IsState(EEntityState.Dizzy))
                    {
                        animation = EAnimationName.dizzy;
                    }
                    else if (state is EEntityState.Freeze || IsState(EEntityState.Freeze))
                    {
                        animation = EAnimationName.freeze;
                    }
                }
                Context.Animator.Play(animation);
            }
        }
        public void RemoveState(EEntityState state)
        {
            var entity = Context.Entity;
            if (entity.IsDead)
            { // 已经死亡，不能再修改状态
                return;
            }
            var isChanged = entity.RemoveState(state);
            if (state is EEntityState.Dizzy or EEntityState.Freeze or EEntityState.Palsy)
            { //
              // 动作显示优先级: Dizzy > Freeze > palsy
                if (isChanged == false || IsState(EEntityState.Dizzy))
                { // 状态没有改变 || 还在眩晕
                    return;
                }
                if (/*state is EEntityState.Dizzy && */IsState(EEntityState.Freeze))
                { // 移除的是眩晕且还在冰冻状态，更换动作
                    Context.Animator.Play(EAnimationName.freeze);
                    return;
                }
                if (IsState(EEntityState.Palsy))
                {
                    Context.Animator.Play(EAnimationName.palsy);
                    return;
                }
                Context.Animator.Play(EAnimationName.idle);
                Context.Move.Resume();
                Context.Skill.Resume();
            }
        }
        public bool IsState(EEntityState state)
        {
            return Context.Entity.IsState(state);
        }
        public void Reset()
        {
            Context.Entity.RemoveState(EEntityState.All);
            Context.Animator.Play(EAnimationName.idle);
        }

        //public EEntityState State
        //{
        //    get => Context.Entity.State;
        //    set
        //    {
        //        var entity = Context.Entity;
        //        if (value != EEntityState.Idle && value == entity.State)
        //        {
        //            return;
        //        }
        //        if (entity.IsDead)
        //        { // 已经死亡，不能再修改状态
        //            return;
        //        }
        //        entity.State = value;
        //        //VM.StateText.text = value.ToString();
        //        //Animation
        //        if (value == EEntityState.Dead)
        //        {
        //            //TODO 死亡动作  停止所有组件
        //            _deadTimer = Context.Time.AddDelayTimer(500, () =>
        //            { // 死亡事件通知
        //                _deadTimer = null;
        //                EventSingle.Instance.Notify(EventDefine.GameMainMapRemoveEntity, entity.EntityId);
        //            });
        //        }
        //        else if (value == EEntityState.Idle)
        //            Context.Animator.Play(EAnimationName.idle);
        //    }
        //}
    }
}
