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

namespace XmdsCommonSkill.Plugin.Buffs
{

    /// <summary>
    ///BUFF:伤害减免
    /// </summary>
    public class XmdsBuff_DamageRemit : XmdsBuffBase
    {
        //减免的技能类型
        public XmdsSkillType remitSkilType = XmdsSkillType.none;

        ///填正值为扣血.
        public int ChangeValue = 0;

        public int UUID = 0;

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

		public override void CopyTo(UnitBuff other)
		{
			var ret = other as XmdsBuff_DamageRemit;

			ret.ChangeValue = this.ChangeValue;

			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)
        {
            UUID = hitter.RegistOnHitDamage(OnUnitHitEvent, null);
        }

        public override void BuffEnd(XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace)
        {
            hitter.UnRegistOnHitDamage(UUID);
        }

        //被打监听.
        protected virtual float OnUnitHitEvent(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, 
            ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
        {
            if(remitSkilType == XmdsSkillType.none || (source.FromSkillType == this.remitSkilType))
            {
                if (BuffUseType == (int)XmdsBuffUseType.Times && BuffInvaildCheck())
                {
                    hitted.mUnit.removeBuff(BindBuffID);
                }

                //伤害减免
                damage = CUtils.CastInt(damage * XmdsUnitProp.PER * (XmdsDamageCalculator.PERER - this.ChangeValue));
            }
          
            return damage;
        }

    }
}