using CommonAI.Zone;
using CommonAI.Zone.Helper;
using CommonAI.Zone.Instance;
using CommonLang;
using XmdsCommon.Plugin;
using XmdsCommonServer.Plugin;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
using XmdsCommonServer.XLS.Data;
using XmdsCommonSkill.Plugin.Buffs;

namespace XmdsCommonSkill.Plugin.Skills.Magic
{
	/// <summary>
	/// 法师三技能:3-5(闪现到指定点也会形成圆形区域,进入该技能两个圆形区域的敌人受到0.5秒压制效果和额外伤害)
	/// </summary>
	public class Magic_310350 : Magic_310340
	{
        private static readonly int ID = 310350;

		//额外伤害
		public XmdsSkillValue mValueSet3;

		//扩展配置
		public XmdsSkillValue mValueSet5;
		//两个圈之间标记时间
		public XmdsSkillValue mValueSet6;

		public static readonly int Buff_ID = (int)XmdsBuffBase.XmdsBuffList.FS_YAZHI_3_5;
        public static readonly int Buff_ID_1 = (int)XmdsBuffBase.XmdsBuffList.FS_TAG_3_5;
        public static readonly int Buff_ID_2 = (int)XmdsBuffBase.XmdsBuffList.FS_TAG_3_5Ext;

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

        protected override void OnInit(GameSkill info, XmdsVirtual unit, ref SkillTemplate template)
        {
            // Buff修改
            var pack = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(Buff_ID);
            var bt = pack.mBuffTemplate;
            bt.LifeTimeMS = mValueSet5.GetValue(info.TalentSkillLevel2);
            bt.IsHarmful = true;
            pack.BindTemplateAndDispose();
            unit.RegistSendBuff(bt);

			// 标记时间,内部定义即可
            var pack1 = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(Buff_ID_1);
            var bt1 = pack1.mBuffTemplate;
            bt1.LifeTimeMS = mValueSet6.GetValue(info.TalentSkillLevel2);
            bt1.IsHarmful = true;
            pack1.BindTemplateAndDispose();
            unit.RegistSendBuff(bt1);

            var pack2 = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(Buff_ID_2);
            var bt2 = pack2.mBuffTemplate;
            bt2.LifeTimeMS = mValueSet6.GetValue(info.TalentSkillLevel2); ;
            bt2.IsHarmful = true;
            pack2.BindTemplateAndDispose();
            unit.RegistSendBuff(bt2);
			unit.RegistLaunchSkillOver(OnLaunchSkillOver, info);
		}

		private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState state)
		{
			info.mHitUnits.Clear();
			return 0;
		}

		protected override void OnSkillDataChange(GameSkill gs, XmdsVirtual unit)
		{
			base.OnSkillDataChange(gs, unit);

			var bt1 = unit.GetRegistBuff(Buff_ID);
			bt1.LifeTimeMS = mValueSet5.GetValue(gs.TalentSkillLevel2);

			var bt2 = unit.GetRegistBuff(Buff_ID_1);
			bt2.LifeTimeMS = mValueSet6.GetValue(gs.TalentSkillLevel2);

			var bt3 = unit.GetRegistBuff(Buff_ID_2);
			bt3.LifeTimeMS = mValueSet6.GetValue(gs.TalentSkillLevel2);
		}

        protected override void OnSkillLogicAftercalDamage(BattleParams param)
        {
			//寒霜区域
			bool hasExtDamage = false;
            if (param.AtkProp.DamagePerID == 2)
            {
				if (param.Attacker.mUnit != param.Hitter.mUnit)
                {
					param.Hitter.mUnit.AddBuff(Buff_ID_1, param.Attacker.mUnit);

					//检测另外一个寒霜区域标记是否有
					if (param.Hitter.mUnit.GetBuffByIDAndSender(Buff_ID_2, param.Attacker.mUnit.ID) != null)
					{
						param.Hitter.mUnit.AddBuff(Buff_ID, param.Attacker.mUnit);
						hasExtDamage = true;
					}
				}				
            }
            else if(param.AtkProp.DamagePerID == 3)
            {
                param.Hitter.mUnit.AddBuff(Buff_ID_2, param.Attacker.mUnit);

                //检测另外一个寒霜区域标记是否有
                if (param.Hitter.mUnit.GetBuffByIDAndSender(Buff_ID_1, param.Attacker.mUnit.ID) != null)
				{
                    param.Hitter.mUnit.AddBuff(Buff_ID, param.Attacker.mUnit);					
					hasExtDamage = true;
				}
            }

			//额外伤害
			if (hasExtDamage && !param.GameSkill.mHitUnits.ContainsKey(param.Hitter.mUnit.ID))
			{
				param.GameSkill.mHitUnits.Put(param.Hitter.mUnit.ID, 1);
				int finalAttack = param.Attacker.MirrorProp.GetFinalAttack(param.Hitter.mUnit.IsMonster);
				int baseDamage = CUtils.CastInt(finalAttack * XmdsUnitProp.PER * mValueSet3.GetValue(param.GameSkill.TalentSkillLevel2));
				int extDamage = XmdsDamageCalculator.GetDamage(baseDamage, param.Attacker, param.Hitter, param.Source);
				param.Hitter.AddHP(-extDamage, param.Attacker.mUnit);
			}    
        }

        protected override void OnInitConfig()
        {
            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 mValueSet5, XmdsSkillData.XmdsSkillDataKey.ValueSet5);
			InitData(data, out mValueSet6, XmdsSkillData.XmdsSkillDataKey.ValueSet6);
			InitData(data, out mValueSet7, XmdsSkillData.XmdsSkillDataKey.ValueSet7);
		}
    }
}