package model

import (
	"leafstalk/otherutils/deepcopy"
	"strconv"

	"xorm.io/xorm"
)

type ForagePointsSetting struct {
	Count            int64           `json:"count"`            // 总点数
	PointsAllocation map[int64]int64 `json:"pointsAllocation"` // 点数分配 {配置表id:分配点数} 点数-1表示未激活
}

type ForagePrivilegeCard struct {
	Typ          int64 `json:"typ"`          // 特权卡类型 1战斗特权卡 2钻石特权卡
	PurchaseTime int64 `json:"purchaseTime"` // 购买时间
}

type ForageSetting struct {
	Points         ForagePointsSetting `json:"points"`
	PrivilegeCards map[int64]int64     `json:"privilegeCards"`
	// 超值月卡购买时间
	MonthCardsBuyTs map[int64]int64 `json:"monthCardsBuyTs"` // {月卡id:购买时间}
}

// type RewardInfo struct {
// 	Id    int64 `json:"id"`
// 	Type  int64 `json:"type"`
// 	Count int64 `json:"count"`
// }

// type RewardData struct {
// 	Exp   int64                 `json:"userExp"`
// 	Items map[int64]*RewardInfo `json:"items"`
// 	Runes map[int64]*BagRune    `json:"runes"`
// }

type RewardRemainder struct {
	Exp          float64 `json:"exp"`
	Gold         float64 `json:"gold"`
	Diamond      float64 `json:"diamond"`
	Rune         float64 `json:"rune"`
	Legend       float64 `json:"legend"`
	Resonance    float64 `json:"resonance"`
	RuneMaterial float64 `json:"runeMaterial"`
	Other        float64 `json:"other"`
}

func NewForagePlayer() *ForagePlayer {
	return &ForagePlayer{
		ForageSetting: &ForageSetting{
			Points: ForagePointsSetting{
				Count:            0,
				PointsAllocation: make(map[int64]int64),
			},
			PrivilegeCards:  map[int64]int64{},
			MonthCardsBuyTs: map[int64]int64{},
		},
		Reward:          make(map[int64]*DropedItem),
		RewardRemainder: &RewardRemainder{},
	}
}

type ForagePlayer struct {
	Id              int64
	PlayerId        int64                 `xorm:"BIGINT index 'playerid'"`
	Level           int64                 `xorm:"int 'level'"`
	ForageSetting   *ForageSetting        `xorm:"Text json 'forageSetting'"`   // 巡逻配置
	AdNum           int64                 `xorm:"int 'adNum'"`                 // 广告使用次数
	FastNum         int64                 `xorm:"int 'fastNum'"`               // 快速巡逻使用次数
	LastFastTime    int64                 `xorm:"BIGINT 'lastFastTime'"`       // 最后一次使用广告或快速巡逻时间（用来重置次数）
	Reward          map[int64]*DropedItem `xorm:"Text json 'reward'"`          // 已获得奖励
	RewardRemainder *RewardRemainder      `xorm:"Text json 'rewardRemainder'"` // 未满1的奖励余数
	StartTime       int64                 `xorm:"BIGINT 'startTime'"`          // 开始时间
	LastRewardTime  int64                 `xorm:"BIGINT 'lastRewardTime'"`     // 最后一次计算奖励的时间
	TimeLen         int64                 `xorm:"BIGINT 'timeLen'"`            // 已经巡逻时长 防止调系统时间
}

func (m ForagePlayer) TableName() string {
	return "player_forage"
}

// 需要保存的数据需确保在这里能复制到new1 中
//func (m *ForagePlayer) DeepCopy() interface{} {
//	new1 := new(ForagePlayer)
//	*new1 = *m
//
//	return new1
//}

func (m *ForagePlayer) QueryExist(eng *xorm.Engine) (bool, error) {
	player := new(ForagePlayer)
	player.PlayerId = m.PlayerId
	return eng.Exist(player)
}

func (m *ForagePlayer) UpdateDB(eng *xorm.Engine) (int64, error) {
	return eng.Where("playerid=?", m.PlayerId).AllCols().Update(m)
}

func (m *ForagePlayer) GetUniqueKey() string {
	//return m.UserId
	return strconv.FormatInt(m.PlayerId, 10)
}

// 实现DeepCopy接口
func CopyForagePlayer(old *ForagePlayer) *ForagePlayer {
	new2, err := deepcopy.Copy(old) //
	if err != nil {
		return nil
	}
	return new2.(*ForagePlayer)
}

const (
	OutputBase = 1000 //产出量分母

	//巡逻加成类型
	PatrolBonusTypeExp     = 1
	PatrolBonusTypeGold    = 2
	PatrolBonusTypeDiamond = 3
	PatrolBonusTypeOther   = 4
	PatrolBonusTypeRune    = 5
	PatrolBonusTypeLegend  = 6
)

// 巡逻Base-PatrolBase exported from 巡逻配置.xlsx
type PatrolBase struct {
	PatrolTimeMax     int64   `json:"PatrolTimeMax"`     // 巡逻基础 上限时间 /小时
	DiamondOutput     int64   `json:"DiamondOutput"`     // 钻石产出基础量 /小时
	FastPatrolNum     int64   `json:"FastPatrolNum"`     // 每日快速巡逻次数
	FastPatrolConsume int64   `json:"FastPatrolConsume"` // 快速巡逻消耗体力量
	ADNum             int64   `json:"ADNum"`             // 每日广告巡逻次数
	ADID              int64   `json:"ADID"`              // 广告点ID
	RewardCycle       float64 `json:"RewardCycle"`       // 可领取时间 生成奖励周期 /小时
} // package model

// 巡逻基础产出-PatrolOutput exported from 巡逻配置.xlsx
type PatrolOutput struct {
	Grade          int64 `json:"Grade"`          // 等级
	LevelID        int64 `json:"LevelID"`        // 解锁关卡编号
	GoldNum        int64 `json:"GoldNum"`        // 金币量 （千分位） /分钟
	ExpNum         int64 `json:"ExpNum"`         // 经验量 （千分位） /分钟
	EquipGroup     int64 `json:"EquipGroup"`     // 符文（装备） 随机掉落组号
	EquipNum       int64 `json:"EquipNum"`       // 符文（装备） （千分位） /分钟
	LegendGroup    int64 `json:"LegendGroup"`    // 铭文 随机掉落组号
	LegendNum      int64 `json:"LegendNum"`      // 铭文 （千分位） /分钟
	MaterialGroup1 int64 `json:"MaterialGroup1"` // 共鸣材料 随机掉落组号
	MaterialNum1   int64 `json:"MaterialNum1"`   // 共鸣材料 （千分位） /分钟
	MaterialGroup2 int64 `json:"MaterialGroup2"` // 符文升级材料 随机掉落组号
	MaterialNum2   int64 `json:"MaterialNum2"`   // 符文升级材料 （千分位） /分钟
	MaterialGroup3 int64 `json:"MaterialGroup3"` // 其它道具 随机掉落组号
	MaterialNum3   int64 `json:"MaterialNum3"`   // 其它道具 （千分位） /分钟
} // package model

// 加成点数-PatrolBonusDot exported from 巡逻配置.xlsx
type PatrolBonusDot struct {
	Num     int64 `json:"Num"`     // 加成点数数量
	LevelID int64 `json:"LevelID"` // 解锁关卡
} // package model

// 巡逻加成量-PatrolBonus exported from 巡逻配置.xlsx
type PatrolBonus struct {
	Type     int64   `json:"Type"`     // 类型
	TypeName string  `json:"TypeName"` // 类型名字
	DanNum   int64   `json:"DanNum"`   // 基础档位数量
	DanBonus float64 `json:"DanBonus"` // 每档增加 /百分比
	Icon     string  `json:"Icon"`     // 图标
}
