using CommonAI.data;
using CommonAI.Data;
using CommonAI.Zone.Formula;
using CommonLang;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XmdsCommon.Plugin;
using XmdsCommonServer.Plugin;
using XmdsCommonServer.XLS.Data;
using XmdsCommonSkill.Plugin.Buffs;
using XmdsCommonSkill.Plugin.Skills;

namespace XmdsCommonSkill.Plugin.PassiveSkills.Boss
{
	/// <summary>
	/// boss - 被动狂暴,血量下降到x%时,增加属性
	/// </summary>
	class Boss_91000 : XmdsPassiveSkillBase
	{
		private int mUUID_1 = 0;
		public static readonly int ID = 91000;
		public override int SkillID { get { return ID; } }

		//绑定buffID
		private static int mBuffID = (int)XmdsBuffBase.XmdsBuffList.BOSS_CRAZE;

		private static XmdsSkillValue mValueSet1;				// 血量阀值
		private static XmdsSkillValue mValueSet2;				// 血量系数
		private static XmdsSkillValue mValueSet3;				// 攻击系数
		private static XmdsSkillValue mValueSet4;				// 防御系数
		private static XmdsSkillValue mValueSet5;				// 暴击系数
		private static XmdsSkillValue mValueSet6;				// 爆伤系数
		private static XmdsSkillValue mValueSet7;				// 攻速系数
		private static XmdsSkillValue mValueSet8;				// 移速系数

		//内部数据
		private long mTriggerHP = 0;
		private XmdsVirtual mOwner = null;
		private long mNextTriggerTime;

		private static int mBuffTime = 3600000;

		protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner)
		{
			mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);

			this.mOwner = owner;
			this.mTriggerHP = CUtils.CastInt(owner.mUnit.MaxHP * XmdsUnitProp.PER * mValueSet1.GetValue(skillInfo.SkillLevel));

			//buff初始化
			var pack = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(mBuffID);
			var buff1 = pack.GetXmdsBuff(0) as XmdsBuff_PropChange;
			buff1.CurentChangeType = XmdsVirtual.UnitAttributeType.MaxHP;
			buff1.IsPercent = true;
			buff1.CurrentValue = mValueSet2.GetValue(skillInfo.SkillLevel);

			var buff2 = pack.GetXmdsBuff(1) as XmdsBuff_PropChange;
			buff2.CurentChangeType = XmdsVirtual.UnitAttributeType.Attack;
			buff2.IsPercent = true;
			buff2.CurrentValue = mValueSet3.GetValue(skillInfo.SkillLevel);

			var buff3 = pack.GetXmdsBuff(2) as XmdsBuff_PropChange;
			buff3.CurentChangeType = XmdsVirtual.UnitAttributeType.Defence;
			buff3.IsPercent = true;
			buff3.CurrentValue = mValueSet4.GetValue(skillInfo.SkillLevel);

			var buff4 = pack.GetXmdsBuff(3) as XmdsBuff_PropChange;
			buff4.CurentChangeType = XmdsVirtual.UnitAttributeType.CritRate;
			buff4.IsPercent = true;
			buff4.CurrentValue = mValueSet5.GetValue(skillInfo.SkillLevel);

			var buff5 = pack.GetXmdsBuff(4) as XmdsBuff_PropChange;
			buff5.CurentChangeType = XmdsVirtual.UnitAttributeType.CritDamage;
			buff5.IsPercent = true;
			buff5.CurrentValue = mValueSet6.GetValue(skillInfo.SkillLevel);

			var buff6 = pack.GetXmdsBuff(5) as XmdsBuff_PropChange;
			buff6.CurentChangeType = XmdsVirtual.UnitAttributeType.AttackSpeed;
			buff6.IsPercent = true;
			buff6.CurrentValue = mValueSet7.GetValue(skillInfo.SkillLevel);

			var buff7 = pack.GetXmdsBuff(6) as XmdsBuff_PropChange;
			buff7.CurentChangeType = XmdsVirtual.UnitAttributeType.MoveSpeed;
			buff7.IsPercent = true;
			buff7.CurrentValue = mValueSet8.GetValue(skillInfo.SkillLevel);

			var bt = pack.mBuffTemplate;
			bt.IsHarmful = false;
			bt.LifeTimeMS = mBuffTime;
			pack.BindTemplateAndDispose();
			owner.RegistSendBuff(bt);
		}

		private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
			ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
		{
			if (this.mNextTriggerTime < CommonLang.CUtils.localTimeMS)
			{
				int tempHp = this.mOwner.mUnit.CurrentHP - (int)damage;
				if(tempHp > 0 && tempHp <= this.mTriggerHP)
				{
					hitted.mUnit.AddBuff(mBuffID, hitted.mUnit);
					this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + mBuffTime;
				}
			}
			return damage;
		}

		protected override void OnUpdate(int intervalMS, bool slowRefresh)
		{
			if(this.mNextTriggerTime > CommonLang.CUtils.localTimeMS && this.mOwner.GetBattleStatus() == BattleStatus.None)
			{
				this.mNextTriggerTime = 0;
				this.mOwner.mUnit.removeBuff(mBuffID);
			}
		}

		protected override void OnInitSkillParam()
		{
			XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
			InitData(data, out mValueSet1, XmdsSkillData.XmdsSkillDataKey.ValueSet);
			InitData(data, out mValueSet2, XmdsSkillData.XmdsSkillDataKey.ValueSet2);
			InitData(data, out mValueSet3, XmdsSkillData.XmdsSkillDataKey.ValueSet3);
			InitData(data, out mValueSet4, XmdsSkillData.XmdsSkillDataKey.ValueSet4);
			InitData(data, out mValueSet5, XmdsSkillData.XmdsSkillDataKey.ValueSet5);
			InitData(data, out mValueSet6, XmdsSkillData.XmdsSkillDataKey.ValueSet6);
			InitData(data, out mValueSet7, XmdsSkillData.XmdsSkillDataKey.ValueSet7);
			InitData(data, out mValueSet8, XmdsSkillData.XmdsSkillDataKey.ValueSet8);
		}

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