using System;
using System.Collections.Generic;
using CombatCore.SerializationTimeLine;
using CombatLibrary.CombatLibrary.CombatCore;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Utility.CombatEvent;
using Excel2Json;
using Fort23.Common;
using Fort23.UTool;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero;
using GameLogic.CombatScenesTool;
using UnityEngine;
using Utility;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
namespace GameLogic.Combat.Skill
{
    public abstract class SkillBasic : IDisposable, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity,
        ITimeLineTriggerEvent, ITimeLineAlertTargetEnter
    {
        public int skillGuid;
        public int UseCount;
        /// 
        /// 普攻是否是近战
        /// 
        public bool isMelee;
        /// 
        /// 是否被激活
        /// 
        public bool isActive = true;
        /// 
        /// 是否使用中
        /// 
        private bool isUse;
        public CombatHeroEntity CombatHeroEntity
        {
            get { return _combatHeroEntity; }
        }
        /// 
        /// 当前激活技能的TimeLine数据
        /// 
        protected List currUseAllTimeLineLogic = new List();
        private CombatHeroEntity _combatHeroEntity;
        private Map>
            _triggerCallBack =
                new Map>();
        public SkillConfig SelfSkillConfig;
        /// 
        /// 武器专属机技能配置
        /// 
        public SkillConfig WeaponSkillConfig;
        /// 
        /// 释放技能的时候当前焦点的目标
        /// 
        public CombatHeroEntity currFocusTarget;
        /// 
        /// 激活的timelinegoup名字
        /// 
        public string ActiveTimeLineGroupName;
        private System.Action finishCallBack;
        /// 
        /// 完成时 是否是要完成的timeGroupName
        /// 
        protected string _finishTimeLineGroupName;
        protected BetterList _enterAlertTarget = new BetterList();
        protected BetterList _currUseSkillTarget = new BetterList();
        protected bool _isEarlyWarning;
        /// 
        /// 是否使用技能目标里的缓存池子
        /// 
        protected bool _useSkillTargetPool = true;
        public TriggerData triggerData
        {
            get
            {
                _triggerData.Source = this;
                return _triggerData;
            }
        }
        private TriggerData _triggerData;
        /// 
        /// 技能cd
        /// 
        public float SkillCd
        {
            get { return _skillCd; }
            set { _skillCd = value; }
        }
        private float _skillCd;
        public float SkillMaxCd;
        // protected HarmType _harmType;
        private CombatParticleSystemPool _earlyWarningFx;
        private CombatHeroEntity _earlyWarningFristHero;
        public T This()
        {
            return (T)(object)this;
        }
        public void InitSkill(CombatHeroEntity combatHeroEntity)
        {
            _combatHeroEntity = combatHeroEntity;
            ProInitSkill();
        }
        public virtual void ActiveLimitSkill()
        {
            isActive = true;
        }
        /// 
        /// 开始游戏
        /// 
        public void StartGame()
        {
            //  InitSpecialWeapon();
            if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)
            {
                UseSkill();
            }
            ProStartGame();
        }
        public void InitSkillConfig(SkillConfig skillConfig)
        {
            SkillMaxCd = skillConfig.cd;
            _skillCd = SkillMaxCd;
            SelfSkillConfig = skillConfig;
            UseCount = skillConfig.SkillType * 100000;
            skillGuid = skillConfig.ID;
            // LogTool.Log("初始化技能"+skillConfig.scriptName);
        }
        /// 
        /// 设置激活的TimeLine名字
        /// 
        public void SetActiveTimeLineGroupName(string groupName)
        {
            ActiveTimeLineGroupName = groupName;
        }
        public virtual bool IsCanUse()
        {
            return true;
        }
        private bool IsWeaponIsSpecial
        {
            get { return WeaponSkillConfig.ID > 0; }
        }
        protected virtual void EarlyWarning()
        {
        }
      
        public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType,
            TriggerData triggerData, HarmType harmType = HarmType.Null)
        {
            if (target == null || target.combatHeroEntity == null)
            {
                return  null;
            }
            return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData,
                harmType);
        }
        public HarmReturnInfo Recover(CombatHeroEntity source, CombatHeroHitPoint target, long att,
            AttType attType, HarmType harmType)
        {
            return CombatCalculateTool.Instance.Recover(source, target, att, attType, harmType, triggerData);
        }
        public void SetSkillFinishCallBack(System.Action finishCallBack)
        {
            this.finishCallBack = finishCallBack;
        }
        /// 
        /// 开始使用技能
        /// 
        public void UseSkill()
        {
            _enterAlertTarget.Clear();
            UseCount++;
            _triggerData = new TriggerData();
            isUse = true;
            _triggerData.TriggerGuid = UseCount;
            _currUseSkillTarget.Clear();
            currUseAllTimeLineLogic.Clear();
            // CombatEventManager.Instance.Dispatch(CombatEventType.HeroUseSkill, new HeroUseSkillEventData()
            // {
            //     CombatHeroEntity = CombatHeroEntity,
            //     SkillBasic = this
            // });
            ProUseSkill();
        }
        public void Dispose()
        {
            currUseAllTimeLineLogic.Clear();
            ProDispose();
            _combatHeroEntity = null;
        }
        public void ReduceCd(float time)
        {
            if (!isActive || !IsCanReduceCd())
            {
                return;
            }
            _skillCd -= time;
        }
        protected virtual bool IsCanReduceCd()
        {
            return true;
        }
        public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
        {
            return _combatHeroEntity.GetSpecialDotInfo(specialDotName);
        }
        public T GetILifetCycleHitPoint(string hitPoinName, bool isStandType, bool isIgnoreHind)
            where T : ILifetCycleHitPoint
        {
            return _combatHeroEntity.GetILifetCycleHitPoint(hitPoinName, isStandType, isIgnoreHind);
        }
        public T GetMainHotPoin(bool isIgnoreHind) where T : ILifetCycleHitPoint
        {
            throw new NotImplementedException();
        }
        public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)
        {
        }
        /// 
        /// 添加trigger监听事件
        /// 
        /// 
        /// 
        protected void AddTriggerCallBack(string groupName,
            System.Action callBack)
        {
            if (!_triggerCallBack.ContainsKey(groupName))
            {
                _triggerCallBack.Add(groupName, callBack);
            }
        }
        /// 
        /// 移除trigger添加事件
        /// 
        /// 
        /// 
        protected void RemoveTriggerCallBack(string groupName,
            System.Action callBack)
        {
            if (_triggerCallBack.ContainsKey(groupName))
            {
                _triggerCallBack.Remove(groupName);
            }
        }
        /// 
        /// 激活timeLine数据
        /// 
        /// 组
        /// 传递给timeLine的目标
        /// 透传消息
        /// 自定义坐标
        /// timeLine完成回调
        public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName,
            BetterList currTarget = null,
            Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default,
            object extraData = null)
        {
            bool isNoAnim = false;
            if (groupName.Contains("noAnim"))
            {
                groupName = groupName.Replace("noAnim", "");
                isNoAnim = true;
            }
            TimeLineEventLogicGroupBasic timeLineEventLogicGroup =
                _combatHeroEntity.combatHeroTimeLineControl.TimeLineData
                    .GetTimeLineEventLogicGroup(groupName, null);
            try
            {
                if (timeLineEventLogicGroup != null)
                {
                    
                    timeLineEventLogicGroup.extraData = extraData;
                    timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData, customizePos);
                    timeLineEventLogicGroup.TimeLineUpdateEnd = finishCallBack;
                    timeLineEventLogicGroup.timeLineTime = startTime;
                    _combatHeroEntity.combatHeroTimeLineControl.AddEventLogicGroup(timeLineEventLogicGroup);
                    currUseAllTimeLineLogic.Add(timeLineEventLogicGroup);
                }
            }
            catch (Exception e)
            {
                LogTool.Error(e);
            }
            return timeLineEventLogicGroup;
        }
        /// 
        /// 打断技能
        /// 
        public void BreakSkill()
        {
            // CombatEventManager.Instance.Dispatch(CombatEventType.BreakSkill, new CombatEventDefaultData()
            // {
            //     datas = new object[2] { _combatHeroEntity, this }
            // });
            for (int i = 0; i < currUseAllTimeLineLogic.Count; i++)
            {
                currUseAllTimeLineLogic[i].BreakTimeLine();
                _combatHeroEntity.combatHeroTimeLineControl.RemoveEventLogicGroup(currUseAllTimeLineLogic[i]);
            }
            currUseAllTimeLineLogic.Clear();
            SkillPlayFinish();
            ProBreakSkill();
        }
        /// 
        /// 技能timeLine的完成标志。表示当前TimeLine播放完成
        /// 
        /// 那一个组的完成了
        public void TimeLineEndSing(string groupName)
        {
            ProTimeLineEndSing(groupName);
        }
        /// 
        /// 技能更新
        /// 
        /// 
        public void CombatUpdate(float time)
        {
            ProCombatUpdate(time);
        }
        /// 
        /// 技能播放完成
        /// 
        public void SkillPlayFinish()
        {
            if (!isUse)
            {
                return;
            }
            isUse = false;
            // CombatEventManager.Instance.Dispatch(CombatEventType.SkillFinish, new HeroUseSkillEventData()
            // {
            //     CombatHeroEntity = CombatHeroEntity,
            //     SkillBasic = this
            // });
            ProSkillPlayFinish();
            finishCallBack?.Invoke();
            finishCallBack = null;
            _isEarlyWarning = false;
            _earlyWarningFristHero = null;
            if (_earlyWarningFx != null)
            {
                GObjectPool.Instance.Recycle(_earlyWarningFx);
                _earlyWarningFx = null;
            }
        }
        /// 
        /// timeLine和子弹碰撞后会调用
        /// 
        /// 触发类型,默认没用
        /// 时间线上配置的数据(默认null)
        /// 目标对象(敌人)
        /// 触发的额外数据——透传数据
        public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity,
            ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
        {
            if (targetEntity == null)
            {
                return;
            }
            if (_triggerCallBack.ContainsKey(groupName))
            {
                _triggerCallBack[groupName]?.Invoke(groupName,
                    targetEntity != null ? targetEntity.This() : null, timelineFxLogic,
                    triggerData);
            }
            else
            {
                ProDefaultTimeLineTrigger(groupName,
                    targetEntity != null ? targetEntity.This() : null, timelineFxLogic,
                    triggerData);
            }
        }
        public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)
        {
            // BetterList point = CombatListPool.Instance.Get();
            if (_useSkillTargetPool)
            {
                if (_currUseSkillTarget != null && _currUseSkillTarget.Count > 0)
                {
                    return _currUseSkillTarget.ToArray();
                }
            }
            _currUseSkillTarget.Clear();
            ILifetCycleHitPoint[] allHit = ProGetTineLineTargetEntity(timeLineEventLogicBasic);
            _currUseSkillTarget.AddRange(allHit);
            return _currUseSkillTarget.ToArray();
        }
        public ILifetCycleHitPoint[] FilterTarget(TimeLineEventLogicBasic timeLineEventLogicBasic,
            FXTargetType fixtarget, ILifetCycleHitPoint[] target)
        {
            if ((int)fixtarget == 1)
            {
                return target;
            }
            // BetterList point = CombatListPool.Instance.Get();
            // bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;
            // for (int i = 0; i < target.Count; i++)
            // {
            //     bool targetEnemy = target[i].This().CombatHeroEntity.CombatHeroDataComponent
            //         .CurrCombatHeroInfo.IsEnemy;
            //     if (fixtarget.HasFlag(FXTargetType.Enemy) && targetEnemy != myEnemy)
            //     {
            //         point.Add(target[i]);
            //     }
            //
            //     if (fixtarget.HasFlag(FXTargetType.Teammate) && targetEnemy == myEnemy)
            //     {
            //         point.Add(target[i]);
            //     }
            //
            //     if (fixtarget.HasFlag(FXTargetType.Oneself) &&
            //         target[i].This().CombatHeroEntity == _combatHeroEntity)
            //     {
            //         point.Add(target[i]);
            //     }
            // }
            return target;
        }
        public ILifetCycleHitPoint[] FilterTargetForCombat(TimeLineEventLogicBasic timeLineEventLogicBasic,
            FXTargetType fixtarget,
            ILifetCycleHitPoint[] target)
        {
            return target;
        }
        protected abstract void ProInitSkill();
        protected abstract void ProUseSkill();
        protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity(
            TimeLineEventLogicBasic timeLineEventLogicBasic)
        {
            if (CombatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
            {
                return null;
            }
            return new[] {  CombatHeroEntity.CombatAIBasic.currFocusTarget.GetThis()
                .GetMainHotPoin() };
        }
        /// 
        /// 默认的触发器
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,
            ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
        {
        }
        protected virtual void ProSkillPlayFinish()
        {
        }
        protected virtual void ProDispose()
        {
        }
        /// 
        /// 
        /// 
        /// 
        protected virtual void ProTimeLineEndSing(string groupName)
        {
            if (string.IsNullOrEmpty(_finishTimeLineGroupName))
            {
                SkillPlayFinish();
            }
            else if (_finishTimeLineGroupName == groupName)
            {
                SkillPlayFinish();
            }
        }
        protected virtual void ProCombatUpdate(float time)
        {
        }
        /// 
        /// 技能被打断
        /// 
        protected virtual void ProBreakSkill()
        {
        }
        protected virtual void ProStartGame()
        {
        }
        public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
        {
            ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);
        }
        /// 
        /// 实例化出的特效逻辑初始化
        /// 
        /// 
        /// 
        protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,
            TriggerData triggerData)
        {
        }
        public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
        {
            ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);
        }
        /// 
        /// 触碰地面
        /// 
        /// 
        /// 
        protected virtual void ProTimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic,
            TriggerData triggerData)
        {
        }
        public void InitAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion,GameObject gameObject)
        {
            CombatAlertManager.Instance.AddAlert(gameObject, _combatHeroEntity);
        }
        public void LeaveAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion,GameObject gameObject)
        {
            CombatAlertManager.Instance.RemoveAlert(gameObject);
        }
        public void Enter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider,GameObject gameObject)
        {
            HeroEntityMono heroEntityMono = collider.gameObject.GetComponent();
            if (heroEntityMono == null)
            {
                return;
            }
            CombatHeroEntity target = heroEntityMono.combatHeroEntity;
            if ( timeLineAlertSeriailztion.isFindEnemy&& target.IsEnemy==_combatHeroEntity.IsEnemy ||
                 timeLineAlertSeriailztion.isFindMyHero&& target.IsEnemy!=_combatHeroEntity.IsEnemy )
            {
                return;
            }
            if (_enterAlertTarget.Contains(target))
            {
                return;
            }
            _enterAlertTarget.Add(target);
            if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
            {
                AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
                alertTriggerEventData.combatHeroEntity = target;
                alertTriggerEventData.attackEntity = _combatHeroEntity;
                alertTriggerEventData.collider = collider;
                alertTriggerEventData.triggerObject= gameObject;
                alertTriggerEventData.isTrigger = true;
                CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
            }
            ProHeroEnter(timeLineAlertSeriailztion,target);
        }
        protected virtual void ProHeroEnter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, CombatHeroEntity target )
        {
        }
        public void Leave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider,GameObject gameObject)
        {
            HeroEntityMono heroEntityMono = collider.gameObject.GetComponent();
            if (heroEntityMono == null||CombatHeroEntity==null)
            {
                return;
            }
            CombatHeroEntity target = heroEntityMono.combatHeroEntity;
            if (target.IsEnemy == CombatHeroEntity.IsEnemy)
            {
                return;
            }
            if (!_enterAlertTarget.Contains(target))
            {
                return;
            }
            _enterAlertTarget.Remove(target);
            if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
            {
                AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
                alertTriggerEventData.combatHeroEntity = target;
                alertTriggerEventData.attackEntity = _combatHeroEntity;
                alertTriggerEventData.collider = collider;
                alertTriggerEventData.isTrigger = false;
                alertTriggerEventData.triggerObject= gameObject;
                CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
            }
            ProHeroLeave(timeLineAlertSeriailztion,target);
        }
        protected virtual void ProHeroLeave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, CombatHeroEntity target )
        {
        }
    }
}