using CommonAI.data;
using CommonAI.Zone;
using CommonAI.Zone.Instance;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XmdsCommonServer.XLS.Data;

namespace XmdsCommonSkill.Plugin.Skills
{
	// 法师天赋数据
	public class PlayerCache_Magic : PlayerCacheBase
	{
		private IntIntData[] mTalnetData;				// 天赋值规则: 天赋值上限-value1,该等级天赋获得时长-value2
		private byte mTalnetLv;                         // 天赋等级
		protected long mTalnetLvUpdateTime;             // 天赋等级最后更新时间

		private byte mTalentMaxLv;

		//剑影获得剑气值
		private int mSwordGetTalnetValue;

		public PlayerCache_Magic(InstanceUnit unit, IntIntData[] talnetValue, IntIntIntData refreshRule) : base(unit, refreshRule)
		{
			this.mTalnetData = talnetValue;
			this.mTalentMaxLv = (byte)(talnetValue.Length - 1);
		}

		public void SetSwordAddTalentValue(int value)
		{
			this.mSwordGetTalnetValue = value;
		}

		public int GetSwordTalentValue()
		{
			return this.mSwordGetTalnetValue;
		}

		// 增加天赋点信息
		public override void AddTalentValue(int value)
		{
			//战斗状态下,才会增加剑气值
			if(this.mOwner.Virtual.GetBattleStatus() < CommonAI.Data.BattleStatus.PVE)
			{
				return;
			}

			// 法师每次获得剑气值都是一样的
			value = value == 0 ? this.mSwordGetTalnetValue : value;
			if (value <= 0)
			{
				return;
			}

			// 基础天赋值变更
			int upValue = 0;
			if (mTalnetLv < this.mTalentMaxLv && (upValue = this.mTalentValue + value - mTalnetData[mTalnetLv].value1) > 0)
			{
				this.mTalnetLv += 1;
				this.mTalnetLvUpdateTime = CommonLang.CUtils.S_LOCAL_TIMESTAMPMS;
				this.mTalentValue = Math.Min(upValue, mTalnetData[mTalnetLv].value1);
			}
			else
			{
				this.mTalentValue = Math.Min(this.mTalentValue + value, mTalnetData[mTalnetLv].value1);
			}

			//this.mTalnetUpdateTime = CommonLang.CUtils.S_LOCAL_TIMESTAMPMS;
			base.AddTalentValue(value);
		}

		public override void UseTalentValue(int value)
		{
			if (value <= 0)
			{
				return;
			}

			this.mTalentValue = Math.Max(this.mTalentValue - value, 0);
			//this.mTalnetUpdateTime = CommonLang.CUtils.S_LOCAL_TIMESTAMPMS;

			base.UseTalentValue(value);
		}

		public override bool Refresh(bool notify)
		{

			long timePass = 0;
			//检测天赋值
			bool refrush = base.Refresh(false);


			//检测等级
			if (mTalnetLv > 0 && (timePass = CommonLang.CUtils.S_LOCAL_TIMESTAMPMS - mTalnetLvUpdateTime) > mTalnetData[mTalnetLv].value2)
			{
				mTalnetLv -= 1;
				//避免降级后,天赋值超了
				mTalentValue = Math.Min(mTalentValue, mTalnetData[mTalnetLv].value1);
				refrush = true;
				this.mTalnetLvUpdateTime = CommonLang.CUtils.S_LOCAL_TIMESTAMPMS;

				//降级后,
				//base.mTalnetUpdateTime = CommonLang.CUtils.S_LOCAL_TIMESTAMPMS;
			}

			if (refrush && notify)
			{
				NotifyPlayer();
				return true;
			}
			return false;
		}

		//通知玩家信息变更
		public override void NotifyPlayer()
		{
			RefreshTalnetInfo refreshInfo = new RefreshTalnetInfo((short)this.mTalentValue, this.mTalnetLv, (int)(mTalnetLvUpdateTime / 1000));
			mOwner.Virtual.SendMsgToPlayer(refreshInfo);
		}

		//重置天赋数据
		public void ReSet()
		{
			this.mTalentValue = 0;
			//this.mTalnetUpdateTime = CommonLang.CUtils.localTimeMS;
			this.mTalnetLv = 0;
			this.mTalnetLvUpdateTime = CommonLang.CUtils.localTimeMS;
			this.NotifyPlayer();

		}

		public override byte GetTalentLv() { return this.mTalnetLv; }
	}
}