using CommonAI.Data;
using CommonAI.Zone.Formula;
using CommonAI.Zone.Helper;
using CommonAI.Zone.Instance;
using System;
using XmdsCommon.Plugin;
using XmdsCommonServer.Plugin;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;

namespace XmdsCommonSkill.Plugin.Buffs
{
	//下次普通攻击暴击 & 回血
    public class XmdsBuff_NextAttackCrit_AddHP : XmdsBuffBase
    {
		public int excludeSkillID = 0;
		public int addHPPer = 0;
		public int criteRate = 10000;

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

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

		public override void CopyTo(UnitBuff other)
		{
			var ret = other as XmdsBuff_NextAttackCrit_AddHP;
			ret.excludeSkillID = this.excludeSkillID;
			ret.addHPPer = this.addHPPer;
			ret.criteRate = this.criteRate;
			base.CopyTo(other);
		}

		protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, CommonAI.Zone.Instance.InstanceUnit.BuffState state)
        {
			XmdsVirtual.PropChangeOperation pco = hitter.CreatePropChangeOpertation(this);
			pco.Type = XmdsVirtual.UnitAttributeType.CritRate_NormalAtk;
			pco.Value = this.criteRate;
			pco.OpType = XmdsVirtual.PropChangeOperation.OperateType.Percent;
			mOpID = hitter.AddPropChangeOperation(pco);

			mHandleUUID1 = hitter.RegistOnHitOther(OnHandleHitOther, null);
			mHandleUUID2 = hitter.RegistLaunchSkillOver(OnLaunchSkillOver, null, true);			
		}

		private float OnHandleHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
            ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
		{
            if (this.mTriggerSkillID > 0 && source.FromSkillType == XmdsSkillType.normalAtk)
            {
				int addHP = System.Math.Max(1, Convert.ToInt32(damage * XmdsUnitProp.PER * addHPPer));
				attacker.mUnit.AddHP(addHP, attacker.mUnit);
			}

			return damage;
		}

		// buff效果也可能是在其他模块监听的OnLaunchSkillOver调用的
		private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill)
		{			
			if (skill.GetSkillType() == XmdsSkillType.normalAtk && (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 OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, CommonAI.Zone.Instance.InstanceUnit.BuffState state, bool replace)
        {
			//取消监听.
			hitter.UnRegistOnHitOther(mHandleUUID1);
			hitter.UnRegistLaunchSkillOver(mHandleUUID2);
			if(mOpID > 0)
			{
				hitter.RemovePropChangeOperation(mOpID);
			}			
		}
		
		protected override void OnDispose()
		{
			base.OnDispose();
		}
	}
}