using Animancer;
using Common.Utility.CombatEvent;
using Excel2Json;
using Fort23.Core;
using Fort23.UTool;
using GameLogic.Combat.Buff;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero.State;
using GameLogic.Combat.Skill;
using GameLogic.Hero;
using GameLogic.Player;
using UnityEngine;
using UnityEngine.AI;
namespace GameLogic.Combat.Hero
{
    /// 
    /// 法宝对象
    /// 
    public class CombatMagicWeaponEntity : CombatHeroEntity
    {
        public System.Func CustomizeShowTarget;
        public int MagicWeaponCollisionId = -1;
        protected FabaoConfig _magicWeaponConfig;
        public float cd = 2;
        public WuXingType WuXingType;
        /// 
        /// 充能额外速度
        /// 
        public float cdAddSpeed;
        // public float cdSpeed=1;
        /// 
        /// 是否拥有法宝宝典
        /// 
        public bool isMagicWeaponTreasureBook = false;
        public FaBaoInfo FaBaoInfo
        {
            get { return _faBaoInfo; }
        }
        private FaBaoInfo _faBaoInfo;
        public float HpBl
        {
            get { return _HpBl; }
            set { _HpBl = value; }
        }
        public float MaxHp;
        private float _HpBl = 100;
        public int useIndex;
        /// 
        /// 是否进入战斗状态
        /// 
        public bool isCombatState;
        private MagicWeaponControl _rootMagicWeaponControl;
        public MagicWeaponControl RootMagicWeaponControl
        {
            get { return _rootMagicWeaponControl; }
        }
        // private BetterList allSkill = new BetterList();
        private SkillBasic skillBasic;
        public float MaxCd
        {
            get
            {
                if (skillBasic == null)
                {
                    return 1;
                }
                return skillBasic.SelfSkillConfig.cd;
            }
        }
        private FabaoConfig magicWeaponConfig;
        public void MagicWeaponDie()
        {
            {
                HeroDieEventData heroDieEventData = HeroDieEventData.Create();
                heroDieEventData.combatHeroEntity = this;
                CombatEventManager.Instance.Dispatch(CombatEventType.MagicWeaponDie,
                    heroDieEventData);
                CombatAIBasic.ChangeState(CombatHeroStateType.dile);
            }
        }
        public async CTask Init(MagicWeaponControl magicWeaponControl,
            FaBaoInfo faBaoInfo,
            System.Action callBack = null)
        {
            this._faBaoInfo = faBaoInfo;
            this.magicWeaponConfig = faBaoInfo.FabaoConfig;
            this._rootMagicWeaponControl = magicWeaponControl;
            string modelName = magicWeaponConfig.model;
            CurrCombatHeroInfo = new CombatHeroInfo();
            CurrCombatHeroInfo.modelName = magicWeaponConfig.model;
            // GameTimeLineParticleFactory
            CombatHeroGameObjectPool poolInterface =
                await GObjectPool.Instance.FetchAsync(modelName + ".prefab", null);
#if !COMBAT_SERVER
            if (poolInterface == null || poolInterface.own == null)
            {
                return null;
            }
            poolInterface.own.transform.position = Vector3.one;
            poolInterface.own.SetActive(false);
            combatHeroTimeLineControl = new CombatHeroTimeLineControl();
            combatHeroTimeLineControl.Init(this);
            AssetHandle assetHandle =
                await AssetBundleLoadManager.Instance.LoadAssetAsyncTask(
                    modelName + "_TD.txt");
            if (assetHandle != null)
            {
                TextAsset textAsset = assetHandle.AssetObject();
                TimeLienData timeLienData = JsonManager.FromJson(textAsset.text);
                timeLienData.DeserializeData();
                assetHandle.Release();
                combatHeroTimeLineControl.AddTimeLienData(timeLienData);
            }
            combatHeroGameObject = new CombatHeroGameObject();
            combatHeroGameObject.Init(this, poolInterface);
            CombatHeroSkillControl = new CombatHeroSkillControlBasic();
            CombatHeroSkillControl.Init(this);
            int id = magicWeaponConfig.SkillGroupID * 10 + 1;
            // SkillConfig skillConfig = ConfigComponent.Instance.Get(id);
            SkillInfo skillInfo = new SkillInfo(id, 1);
            skillBasic = CombatHeroSkillControl.AddSkill(skillInfo);
            BuffControl = new BuffControl();
            BuffControl.Init(this);
            if (CombatAIBasic == null)
            {
                CombatAIBasic = new MagicWeaponAi();
            }
            HeroEntityMono heroEntityMono = poolInterface.own.GetComponent();
            if (heroEntityMono == null)
            {
                heroEntityMono = poolInterface.own.AddComponent();
            }
            heroEntityMono.combatHeroEntity = this;
            CombatAIBasic.Init(this);
            // AnimancerComponent animancerComponent = poolInterface.own.GetComponentInChildren();
            combatHeroAnimtion = new CombatHeroAnimtion();
            poolInterface.own.SetActive(true);
            combatHeroAnimtion.Init(this);
            CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);
            if (skillBasic != null)
            {
                cd = skillBasic.SelfSkillConfig.cd;
            }
#endif
            callBack?.Invoke(this);
            return this;
        }
        public override float GetAttSpeed()
        {
            return 1;
        }
        public bool IsCanUse()
        {
            if (cd > 0)
            {
                return false;
            }
            if (_rootMagicWeaponControl.globalMagicWeaponCd > 0)
            {
                return false;
            }
            return true;
        }
        public void UseMagicWeapon()
        {
            if (cd > 0 || _rootMagicWeaponControl.combatHeroEntity.CombatAIBasic.currFocusTarget == null)
            {
                return;
            }
            _HpBl = _faBaoInfo.FabaoPowerupConfig.Power;
            MaxHp= _HpBl;
            cd = MaxCd;
            _rootMagicWeaponControl.UseMagicWeapon(this);
        }
        public override void DormancyObj()
        {
            base.DormancyObj();
            _rootMagicWeaponControl = null;
            _faBaoInfo = null;
        }
        public override void Update(float t)
        {
            if (_rootMagicWeaponControl == null)
            {
                return;
            }
            combatHeroTimeLineControl?.Update(t);
            CombatAIBasic?.Update(t);
            CombatHeroSkillControl?.Update(t);
            BuffControl?.Update(t);
            if (CombatAIBasic?.CurrState.GetType() == typeof(MagicWeapomDormancyState))
            {
                b_1008 b1008 = BuffControl.GetBuffBasicForType();
                if (b1008 == null)
                {
                    cd -= t;
                    if ( IsCanUse())
                    {
                        if (_rootMagicWeaponControl.isAutoUse && cd < -1f)//自动的延迟一秒释放
                        {
                            UseMagicWeapon();
                        }
                    }
                }
            }
        }
    }
}