using CommonAI.Zone.Helper;
using CommonAI.Zone.Instance;
using XmdsCommonServer.Plugin;
using XmdsCommonServer.XLS.Data;
using XmdsCommonSkill.Plugin.Buffs;
using System;
using static CommonAI.Zone.Instance.InstanceUnit;
using XmdsCommon.Plugin;
using CommonAI.Zone;
using XmdsCommonServer.Plugin.Units;
using CommonAI.Zone.Formula;
using XmdsCommonSkill.Plugin.Skills;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
using CommonAI.Data;
using CommonLang;
using XmdsCommonSkill.Plugin.PassiveSkills.Pet20200515;

namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
{
	/// <summary>
	/// NewPet - 防1(攻击时,有N%的几率嘲讽目标,持续N秒。冷却时间N秒。)
	/// </summary>
	class Pet_80008 : PetPassiveBase
	{
		public static readonly int ID = 80008;
		public static int Buff_ID = (int)XmdsBuffBase.XmdsBuffList.NEWPET_CHAOFENG;

		private static XmdsSkillValue triggerRate;              // 触发几率
		private static XmdsSkillValue triggerRateExt;           // 命格增加几率
		private static XmdsSkillValue triggerInterval;          // 触发间隔
		private static XmdsSkillValue mockTime;                 // 嘲讽时间

		// 内部数据
		private int mUUID_1 = 0;
		private long mNextTriggerTime = 0;

		public override int SkillID { get { return ID; } }

		protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner)
		{
			var pack = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(Buff_ID);
			var buff = (XmdsBuff_Mocking)pack.GetXmdsBuff(XmdsBuffProperties.XmdsBuffAbility.Mocking);
			var bt = pack.mBuffTemplate;
			bt.IsHarmful = true;
			bt.LifeTimeMS = mockTime.GetValue(skillInfo.SkillLevel);
			pack.BindTemplateAndDispose();
			owner.RegistSendBuff(bt);

			this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + triggerInterval.GetValue();
			mUUID_1 = owner.RegistOnHitOther(OnHandleHitOther, skillInfo, true);
		}

		protected override void OnSkillDataChange(GameSkill gs, XmdsVirtual unit)
		{
			var bt = unit.GetRegistBuff(Buff_ID);
			bt.LifeTimeMS = mockTime.GetValue(gs.SkillLevel);
		}

		private float OnHandleHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
		ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
		{
			UnitFateType fateType = attacker.GetUnitFateType();
			if (fateType != UnitFateType.None && hitted.mUnit.IsMonster && this.mNextTriggerTime < CommonLang.CUtils.localTimeMS &&
				IsTrigger(attacker, triggerRate, triggerRateExt, skill, fateType))
			{
				var buff = attacker.GetRegisBuffVirtual(Buff_ID) as XmdsBuff_Mocking;
				buff.BuffTarget = attacker;
				hitted.mUnit.AddBuff(Buff_ID, attacker.mUnit);
				this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + triggerInterval.GetValue();
				base.NotifyTriggerAblity(attacker.mUnit, this.SkillID);
			}

			return damage;
		}

		protected override void OnInitSkillParam()
		{
			XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
			InitData(data, out triggerRate, XmdsSkillData.XmdsSkillDataKey.ValueSet);
			InitData(data, out triggerRateExt, XmdsSkillData.XmdsSkillDataKey.ValueSet2);
			InitData(data, out triggerInterval, XmdsSkillData.XmdsSkillDataKey.ValueSet3);
			InitData(data, out mockTime, XmdsSkillData.XmdsSkillDataKey.ValueSet4);
		}

		protected override void OnDispose(XmdsVirtual owner)
		{
			owner.UnRegistOnHitOther(mUUID_1);
		}
	}
}