package model

import (
	"blazing/cool"
	"time"

	"github.com/creasty/defaults"
)

const TableNamePlayerInfo = "player_info"

type Player struct {
	*cool.Model
	PlayerID uint64 `gorm:"not null;index:idx_pet_by_player_id;comment:'所属玩家ID'" json:"player_id"`
	Data     string `gorm:"type:text;not null;comment:'全部数据'" json:"data"`
}
type Pos struct {
	X uint32 `struc:"uint32" default:"0"`
	Y uint32 `struc:"uint32" default:"0"`
}

// PeopleItemInfo 穿戴装备信息结构（PeopleItemInfo）
type PeopleItemInfo struct {
	ID    uint32 `struc:"uint32"`             // 装备id
	Level uint32 `struc:"uint32" default:"1"` // 未知字段（默认值1，@Builder.Default）
}

// InitDefaults 初始化默认值（确保默认值正确赋值）
func (p *PeopleItemInfo) InitDefaults() {
	p.Level = 1 // 未知字段默认值1，与Java的@Builder.Default保持一致
}
func NewPlayerInfo() *PlayerInfo {
	l := &PlayerInfo{

		Clothes: make([]PeopleItemInfo, 0),
		PetList: make([]PetInfo, 0),
	}

	// 自动填充 struct tag 里的 default 值
	if err := defaults.Set(l); err != nil {
		panic(err) // 方便发现 default 设置错误
	}

	return l
}

type PlayerInfo struct {
	GoldBean int32 `struc:"skip" json:"nieo_gold_bean"` // 金豆(特殊货币)

	ExpPool       int64     `struc:"skip" json:"exp_pool"`        // 累计经验池
	LastResetTime time.Time `struc:"skip" json:"last_reset_time"` //  重置时间,比如电池和每日任务
	// OutInfo 字段
	UserID            uint32           `struc:"uint32" json:"user_id"`                           // 米米号 通过sid拿到
	RegisterTime      uint32           `struc:"uint32" json:"register_time"`                     // 注册时间(秒时间戳)
	Nick              string           `struc:"[16]byte" default:"seer" json:"nick"`             // 16字节昵称
	Vip               uint16           `struc:"uint16" json:"vip"`                               // 固定0
	Viped             uint16           `struc:"uint16" default:"15" json:"viped"`                // 固定15
	DSFlag            uint32           `struc:"uint32" json:"ds_flag"`                           // 固定0
	Color             uint32           `struc:"uint32" json:"color"`                             // 机器人颜色RGB颜色值(uint32,实际为3个uint8)
	Texture           uint32           `struc:"uint32" json:"texture"`                           // 固定0
	Energy            uint32           `struc:"uint32" default:"3000" json:"energy"`             // 固定3000
	Coins             uint32           `struc:"uint32" json:"coins"`                             // 赛尔豆
	FightBadge        uint32           `struc:"uint32" json:"fight_badge"`                       // 固定0
	MapID             uint32           `struc:"uint32" default:"1" json:"map_id"`                // 上线地图ID
	Pos               Pos              `json:"pos"`                                              // 坐标
	TimeToday         uint32           `struc:"uint32" default:"0" json:"time_today"`            // 已消耗时间（秒）
	TimeLimit         uint32           `struc:"uint32" default:"43200" json:"time_limit"`        // 总电池限制（秒）
	IsClothHalfDay    byte             `struc:"byte" json:"is_cloth_half_day"`                   // 活动标志0/1
	IsRoomHalfDay     byte             `struc:"byte" json:"is_room_half_day"`                    // 活动标志0/1
	IFortressHalfDay  byte             `struc:"byte" json:"i_fortress_half_day"`                 // 活动标志0/1
	IsHQHalfDay       byte             `struc:"byte" json:"is_hq_half_day"`                      // 活动标志0/1
	LoginCount        uint32           `struc:"uint32" json:"login_count"`                       // 固定0
	Inviter           uint32           `struc:"uint32" json:"inviter"`                           // 固定0
	NewInviteeCount   uint32           `struc:"uint32" json:"new_invitee_count"`                 // 固定0
	VipLevel          uint32           `struc:"uint32" default:"8" json:"vip_level"`             // 固定8
	VipValue          uint32           `struc:"uint32" default:"80000" json:"vip_value"`         // 固定80000
	VipStage          uint32           `struc:"uint32" default:"1" json:"vip_stage"`             // 超no的外形等级建议固定1
	AutoCharge        uint32           `struc:"uint32" default:"1" json:"auto_charge"`           // nono是否自动充电
	VipEndTime        uint32           `struc:"uint32" default:"4294967295" json:"vip_end_time"` // 超no的结束时间建议尽可能大
	FreshManBonus     uint32           `struc:"uint32" json:"fresh_man_bonus"`                   // 邀请活动建议先给固定值0
	NonoChipList      [80]byte         `struc:"[80]byte" json:"nono_chip_list"`                  // 超no芯片列表
	DailyResArr       [50]byte         `struc:"[50]byte" default:"0" json:"daily_res_arr"`       //   每日任务状态  40+是谱尼的
	TeacherID         uint32           `struc:"uint32" json:"teacher_id"`                        // 教官id
	StudentID         uint32           `struc:"uint32" json:"student_id"`                        // 学员id
	GraduationCount   uint32           `struc:"uint32" default:"0" json:"graduation_count"`      // 毕业人数
	MaxPuniLv         uint32           `struc:"uint32" default:"0" json:"max_puni_lv"`           // 默认0, 虚无 元素 能量 生命 轮回 永恒 圣洁 最高为8
	PetMaxLevel       uint32           `struc:"uint32" json:"pet_max_level"`                     // 精灵最高等级
	AllPetNumber      uint32           `struc:"uint32" json:"all_pet_number"`                    // 精灵数量
	MonKingWin        uint32           `struc:"uint32" json:"mon_king_win"`                      // 精灵王胜场
	CurrentStage      uint32           `struc:"uint32" json:"current_stage"`                     // 勇者之塔层数
	MaxStage          uint32           `struc:"uint32" json:"max_stage"`                         // 试炼之塔最高层
	CurrentFreshStage uint32           `struc:"uint32" json:"current_fresh_stage"`               // 当前试炼层数
	MaxFreshStage     uint32           `struc:"uint32" json:"max_fresh_stage"`                   // 最高试炼层
	MaxArenaWins      uint32           `struc:"uint32" json:"max_arena_wins"`                    // 星际擂台连胜
	TwoTimes          uint32           `struc:"uint32" default:"0" json:"two_times"`             // 双倍经验加速器剩余使用次数
	ThreeTimes        uint32           `struc:"uint32" default:"0" json:"three_times"`           // 三倍经验加速器剩余使用次数
	AutoFight         uint32           `struc:"uint32" default:"0" json:"auto_fight"`            // 是否自动战斗
	AutoFightTime     uint32           `struc:"uint32" default:"0" json:"auto_fight_time"`       // 自动战斗剩余的场次
	EnergyTime        uint32           `struc:"uint32" default:"0" json:"energy_time"`           // 能量吸收仪剩余次数
	LearnTimes        uint32           `struc:"uint32" default:"0" json:"learn_times"`           // 学习力吸收仪剩余次数
	MonBattleMedal    uint32           `struc:"uint32" default:"0" json:"mon_battle_medal"`      // 默认0
	RecordCount       uint32           `struc:"uint32" default:"0" json:"record_count"`          // 默认0
	ObtainTm          uint32           `struc:"uint32" default:"0" json:"obtain_tm"`             // 默认0
	SoulBeadItemID    uint32           `struc:"uint32" json:"soul_bead_item_id"`                 // 当前元神珠id
	ExpireTm          uint32           `struc:"uint32" default:"0" json:"expire_tm"`             // 默认0
	FuseTimes         uint32           `struc:"uint32" default:"0" json:"fuse_times"`            // 默认0
	HasNono           uint32           `struc:"uint32" default:"1" json:"has_nono"`              // 玩家是否有nono
	SuperNono         uint32           `struc:"uint32" default:"1" json:"super_nono"`            // 玩家是否有超能nono
	NonoState         uint32           `struc:"uint32" default:"4294967295" json:"nono_state"`   // 默认-1
	NonoColor         uint32           `struc:"uint32" json:"nono_color"`                        // nono颜色
	NonoNick          string           `struc:"[16]byte" default:"nono" json:"nono_nick"`        // nono名字（16字节）
	TeamInfo          TeamInfo         `struc:"struct" json:"team_info"`                         // 战队信息24字节
	TeamPkInfo        TeamPKInfo       `struc:"struct" json:"team_pk_info"`                      // 8字节
	Reserved          byte             `struc:"byte" json:"reserved"`                            // 1字节无内容
	Badge             uint32           `struc:"uint32" default:"0" json:"badge"`                 // 默认0
	Reserved1         [27]byte         `struc:"[27]byte" default:"3" json:"reserved1"`           // 27字节默认3
	TaskList          [500]byte        `struc:"[500]byte" default:"0" json:"task_list"`          // 任务状态数组500字节，默认3
	PetListCount      uint32           `struc:"sizeof=PetList" json:"pet_list_count"`            // 精灵列表长度
	PetList           []PetInfo        `  json:"pet_list"`                                       // 精灵背包内信息
	ClothesCount      uint32           `struc:"sizeof=Clothes" json:"clothes_count"`             // 穿戴装备数量
	Clothes           []PeopleItemInfo `  json:"clothes"`                                        // 穿戴装备
}

// TableName PlayerInfo's table name
func (*Player) TableName() string {
	return TableNamePlayerInfo
}

// GroupName PlayerInfo's table group
func (*Player) GroupName() string {
	return "default"
}

// NewPlayerInfo create a new PlayerInfo
func NewPlayer() *Player {
	return &Player{
		Model: cool.NewModel(),
	}
}

// init 创建表
func init() {
	cool.CreateTable(&Player{})
}
