using CommonAI.data;
using CommonAI.Data;
using CommonAI.Zone.Formula;
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.CardSkill;

namespace XmdsCommon.JSGModule.Interface
{
	/** 卡牌模块技能基类 */
	public interface IJSCardSkillModule : ICardModule
	{
		void Init(XmdsVirtual owner);
		void Update(int interval, bool slowRefresh);
		void OnHitOther(XmdsVirtual hitter, AttackSource source, int damage, DamageType damageType);					// 攻击其他人
		void OnHitDamage(XmdsVirtual attacker, AttackSource source, int damage, DamageType damageType);                 // 收到攻击
		void Dispose();

		/** 重载卡牌权重信息 */
		void ReloadCardSkillWeight();

		//技能数据变更
		void OnSkillDataChange(GameSkill info);
		void OnInitOver(GameSkill gs, IJSGCardSkill cardSkill);

		//改变某一类型卡牌权重
		void ChangeCardWeight(CardType type, CardRateChgType chgType, int value, int validTime, bool isPrecent = true, int validTimes = -1, int uniqueID = 0);

		//额外增加一个球:指定类型和属性
		void AddCard(CardType type, int nums);
		//额外产生一个球:random(true: 使用权重来获取,false: 获得一个权重最高额)
		void AddCard(int nums, bool random);
		

		//上一次释放技能信息
		GetCardData GetLastCardData();

		//下一次强化效果相关
		// 获得特殊效果强化加成
		void TriggerSkillLoadStrength(CardSkillData skillData, int sameNums);
		IntIntData GetStrengthInfo(CardStrengthenType strgnthenType);
		// 添加下一次强化效果(和策划约定:下一次某种类型的卡牌强化,只要触发了改类型卡牌,可用次数减1。不考虑同类卡切卡的问题【如果要考虑则要开发走表格配置功能,根据表格类型控制】)
		NextCardStrengthenInfo AddNextStrengthInfo(CardType type, CardStrengthenType strenghType, int value1, int value2, int validTime, int validTimes = -1, 
			byte needSames = 0, DamageType dmgType = DamageType.None, CardLayerRule layerRules = null);

	}

	/** 卡牌技能基类 */
	public interface IJSGCardSkill
	{
		int GetEffectID(int skillLv, int sameNums);
		void TriggerCardSkill(XmdsVirtual player, XmdsVirtual hitter, AttackSource source, CardSkillData skillData, int sameNums);
	}

	public class XmdsComSrvData
	{
		public static readonly int BOSS_CARD_SKILLID = 1999000;
	}

	//buff移除类型
	public enum BuffRemoveType : byte
	{
		Normal = 0,             // 时间到等自然结束
		Replace = 1,            // 替换
		Remove = 2,
	}
}