using CommonAI.Data;
using CommonAI.Zone;
using CommonAI.Zone.Formula;
using CommonAI.Zone.Helper;
using CommonAI.Zone.Instance;
using XmdsCommon.Plugin;
using XmdsCommonServer.Plugin;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;
using XmdsCommonSkill.Plugin.Interface;
using static XmdsCommonSkill.Plugin.Interface.ComSpellTemplate;

namespace XmdsCommonSkill.Plugin.Buffs
{
    //攻击创建额外法术
    public class XmdsBuff_AttackCreateSpell : XmdsBuffBase
    {
        public XmdsSkillType pointSkillType = 0;        // 0-所有类型技能
        public XmdsSpellID createSpellID = 0;           // 创建法术ID
		public int spellTriggerTimes = 0;				// 法术触发次数
		public int excludeSkillID = 0;

		public int addBuffID = 0;						// 附加的BuffID

		// 额外伤害
        public int damageAddition = 0;                  // 伤害加成
        public int addFixedDamage = 0;                  // 附加固定伤害
        public int chainLevel = 0;                      // 弹射

		private int mTriggerSkillID = 0;            //触发效果的技能ID
		private int mHandleUUID1 = 0;
		private int mHandleUUID2 = 0;


        public override int GetAbilityID()
        {
            return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.AttackCreateSpell;
        }

		public override void CopyTo(UnitBuff other)
		{
			var ret = other as XmdsBuff_AttackCreateSpell;
			ret.pointSkillType = this.pointSkillType;           //0-所有类型技能
			ret.createSpellID = this.createSpellID;             //创建法术ID
			ret.spellTriggerTimes = this.spellTriggerTimes;
			ret.excludeSkillID = this.excludeSkillID;
			ret.addBuffID = this.addBuffID;
			ret.damageAddition = this.damageAddition;           //伤害加成
			ret.addFixedDamage = this.addFixedDamage;
			ret.chainLevel = this.chainLevel;

			base.CopyTo(other);
		}

		protected override void OnBindTemplate(ref BuffTemplate buffTemplate)
		{
			//DOT类技能首帧无效.
			buffTemplate.FirstTimeEnable = false;
			base.OnBindTemplate(ref buffTemplate);
		}

		public override void BuffBegin(XmdsVirtual hitter, XmdsVirtual attacker, InstanceUnit.BuffState state)
        {
			mHandleUUID1 = hitter.RegistOnHitOther(OnHitOther, null, true);
			mHandleUUID2 = hitter.RegistLaunchSkillOver(OnLaunchSkillOver, null, true);
		}

		public override void BuffEnd(XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace)
        {
            hitter.UnRegistOnHitOther(mHandleUUID1);
			hitter.UnRegistLaunchSkillOver(mHandleUUID2);
		}

        protected virtual float OnHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, 
            ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
        {
            //技能类型和技能id匹配时
            if(this.mTriggerSkillID > 0 && (this.pointSkillType == XmdsSkillType.none || this.pointSkillType == source.FromSkillType))
            {
                //额外伤害
                if (damageAddition != 0)
                {
                    damage += damage * XmdsUnitProp.PER * this.damageAddition;
                }
				damage += this.addFixedDamage;

                //创建法术
                if(this.createSpellID != 0 && this.spellTriggerTimes > 0)
                {
					this.spellTriggerTimes--;
					LaunchSpell ls = ComSpellTemplate.Instance().GetSpellByID(this.createSpellID);
                    ls.ChainLevel = this.chainLevel;

                    attacker.mUnit.Parent.unitLaunchSpell(this.pointSkillType, attacker.mUnit, ls,                        
                        hitted.mUnit.X, hitted.mUnit.Y, hitted.mUnit.ID);
                }

				// 添加buff
				if(this.addBuffID != 0)
				{
					hitted.mUnit.AddBuff(this.addBuffID, attacker.mUnit);
				}
            }
            
            return damage;
        }

		private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill)
		{
			if ((this.pointSkillType == XmdsSkillType.none || skill.GetSkillType() == this.pointSkillType) && (this.excludeSkillID == 0 || this.excludeSkillID != skill.Data.ID))
			{
				if(this.mTriggerSkillID > 0)
				{
					launcher.mUnit.removeBuff(this.BindBuffID);
				}
				else
				{
					this.mTriggerSkillID = skill.Data.ID;
				}				
			}

			return 0;
		}

        protected override void OnDispose()
        {
            base.OnDispose();
        }
    }
}