package input

import (
	element "blazing/common/data/Element"
	"blazing/logic/service/fight/info"

	"github.com/mohae/deepcopy"
	"github.com/shopspring/decimal"
)

func (u *Input) Death() {

	u.CurrentPet.Info.Hp = 0

	//todo  待实现死亡effet

}

// 1是添加，-1是减少，0是清除
func (u *Input) SetProp(prop, level int) {

	if level == 0 { //说明是消强
		//todo 消强交互

	}
	//todo  待交互

	u.AttackValue.Prop[prop] = u.AttackValue.Prop[prop] + int8(level)

	//todo  待交互

}
func (i *Input) GetAction(opp *Input) {
	//使用1#技能,实际上要按照四个技能权重去使用
	i.FightC.UseSkill(i.Player, int32(i.FightC.GetCurrPET(i.Player).Skills[0].ID))

}

// todo获取属性，待实现获取后改回原属性
func (i *Input) Prop(in *Input, f func()) {
	oldour := deepcopy.Copy(i.CurrentPet).(*info.BattlePetEntity)
	//oldouo := deepcopy.Copy(opp.CurrentPet).(*info.BattlePetEntity)
	i.Exec(func(t Effect) bool { //属性获取前

		t.BeferAttr(i.CurrentPet) //使XX为XX
		return true
	})

	oldourr := deepcopy.Copy(in.CurrentPet).(*info.BattlePetEntity)
	in.Exec(func(t Effect) bool { //属性获取后

		t.AfterAttr(i.CurrentPet) //视为xx  需要在里面判断来源
		return true
	})
	f()
	in.CurrentPet = oldourr

	i.CurrentPet = oldour //恢复
	//opp.CurrentPet = oldouo     //恢复
}

// 计算技能威力
func (i *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) decimal.Decimal {

	//威力+区
	//威力*区
	//todo 待修复input输入
	// 1. 计算等级因子 (level * 0.4 + 2)
	levelFactor := decimal.NewFromInt(int64(i.CurrentPet.Info.Level)).
		Mul(decimal.NewFromFloat(0.4)).Add(decimal.NewFromInt(2))

	var (
		attackDec  decimal.Decimal //攻击值
		defenseDec decimal.Decimal //防御值

	)

	switch skill.Category() { //判断技能类型
	case info.Category.PHYSICAL:
		i.Prop(i, func() { //我方取我方攻击
			attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[0]))
		})
		deftype.Prop(i, func() { //我方取敌方防御
			defenseDec = decimal.NewFromInt(int64(deftype.CurrentPet.Info.Prop[1]))

		})

	case info.Category.SPECIAL:

		i.Prop(i, func() { //我方取我方攻击
			attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[2]))
		})
		deftype.Prop(i, func() { //我方取敌方防御
			defenseDec = decimal.NewFromInt(int64(deftype.CurrentPet.Info.Prop[3]))

		})

	default:
		return decimal.NewFromInt(0)
	}

	// 5. 基础伤害公式：等级因子 * 威力因子 * 攻击 / 防御 / 50 + 2
	baseDamage := levelFactor.
		Mul(decimal.NewFromInt(int64(skill.Power))).
		Mul(attackDec).
		Div(defenseDec).
		Div(decimal.NewFromInt(50)).
		Add(decimal.NewFromInt(2))

	var typeRate decimal.Decimal

	deftype.Prop(i, func() { //我方取敌方属性,得到敌方的实际和我方的视为
		t, _ := element.NewElementCalculator().GetOffensiveMultiplier(skill.Type().ID, deftype.CurrentPet.Type().ID)

		typeRate = decimal.NewFromFloat(t)

	})

	damage := baseDamage.
		Mul(skill.CriticalsameTypeBonus()). // 同属性加成
		Mul(typeRate).                      // 克制系数

		Mul(skill.Criticalrandom()) //随机波动

	return damage

}
