package characters

import "time"

// Character is a struct that holds info on a character
type Character struct {
	Name                    string    `json:"name"`
	Skin                    Skin      `json:"skin"`
	Level                   int       `json:"level"`
	Xp                      int       `json:"xp"`
	MaxXp                   int       `json:"max_xp"`
	TotalXp                 int       `json:"total_xp"`
	Gold                    int       `json:"gold"`
	Speed                   int       `json:"speed"`
	MiningLevel             int       `json:"mining_level"`
	MiningXp                int       `json:"mining_xp"`
	MiningMaxXp             int       `json:"mining_max_xp"`
	WoodcuttingLevel        int       `json:"woodcutting_level"`
	WoodcuttingXp           int       `json:"woodcutting_xp"`
	WoodcuttingMaxXp        int       `json:"woodcutting_max_xp"`
	FishingLevel            int       `json:"fishing_level"`
	FishingXp               int       `json:"fishing_xp"`
	FishingMaxXp            int       `json:"fishing_max_xp"`
	WeaponcraftingLevel     int       `json:"weaponcrafting_level"`
	WeaponcraftingXp        int       `json:"weaponcrafting_xp"`
	WeaponcraftingMaxXp     int       `json:"weaponcrafting_max_xp"`
	GearcraftingLevel       int       `json:"gearcrafting_level"`
	GearcraftingXp          int       `json:"gearcrafting_xp"`
	GearcraftingMaxXp       int       `json:"gearcrafting_max_xp"`
	JewelrycraftingLevel    int       `json:"jewelrycrafting_level"`
	JewelrycraftingXp       int       `json:"jewelrycrafting_xp"`
	JewelrycraftingMaxXp    int       `json:"jewelrycrafting_max_xp"`
	CookingLevel            int       `json:"cooking_level"`
	CookingXp               int       `json:"cooking_xp"`
	CookingMaxXp            int       `json:"cooking_max_xp"`
	Hp                      int       `json:"hp"`
	Haste                   int       `json:"haste"`
	CriticalStrike          int       `json:"critical_strike"`
	Stamina                 int       `json:"stamina"`
	AttackFire              int       `json:"attack_fire"`
	AttackEarth             int       `json:"attack_earth"`
	AttackWater             int       `json:"attack_water"`
	AttackAir               int       `json:"attack_air"`
	DmgFire                 int       `json:"dmg_fire"`
	DmgEarth                int       `json:"dmg_earth"`
	DmgWater                int       `json:"dmg_water"`
	DmgAir                  int       `json:"dmg_air"`
	ResFire                 int       `json:"res_fire"`
	ResEarth                int       `json:"res_earth"`
	ResWater                int       `json:"res_water"`
	ResAir                  int       `json:"res_air"`
	X                       int       `json:"x"`
	Y                       int       `json:"y"`
	Cooldown                int       `json:"cooldown"`
	CooldownExpiration      time.Time `json:"cooldown_expiration"`
	WeaponSlot              string    `json:"weapon_slot"`
	ShieldSlot              string    `json:"shield_slot"`
	HelmetSlot              string    `json:"helmet_slot"`
	BodyArmorSlot           string    `json:"body_armor_slot"`
	LegArmorSlot            string    `json:"leg_armor_slot"`
	BootsSlot               string    `json:"boots_slot"`
	Ring1Slot               string    `json:"ring1_slot"`
	Ring2Slot               string    `json:"ring2_slot"`
	AmuletSlot              string    `json:"amulet_slot"`
	Artifact1Slot           string    `json:"artifact1_slot"`
	Artifact2Slot           string    `json:"artifact2_slot"`
	Artifact3Slot           string    `json:"artifact3_slot"`
	Consumable1Slot         string    `json:"consumable1_slot"`
	Consumable1SlotQuantity int       `json:"consumable1_slot_quantity"`
	Consumable2Slot         string    `json:"consumable2_slot"`
	Consumable2SlotQuantity int       `json:"consumable2_slot_quantity"`
	InventorySlot1          string    `json:"inventory_slot1"`
	InventorySlot1Quantity  int       `json:"inventory_slot1_quantity"`
	InventorySlot2          string    `json:"inventory_slot2"`
	InventorySlot2Quantity  int       `json:"inventory_slot2_quantity"`
	InventorySlot3          string    `json:"inventory_slot3"`
	InventorySlot3Quantity  int       `json:"inventory_slot3_quantity"`
	InventorySlot4          string    `json:"inventory_slot4"`
	InventorySlot4Quantity  int       `json:"inventory_slot4_quantity"`
	InventorySlot5          string    `json:"inventory_slot5"`
	InventorySlot5Quantity  int       `json:"inventory_slot5_quantity"`
	InventorySlot6          string    `json:"inventory_slot6"`
	InventorySlot6Quantity  int       `json:"inventory_slot6_quantity"`
	InventorySlot7          string    `json:"inventory_slot7"`
	InventorySlot7Quantity  int       `json:"inventory_slot7_quantity"`
	InventorySlot8          string    `json:"inventory_slot8"`
	InventorySlot8Quantity  int       `json:"inventory_slot8_quantity"`
	InventorySlot9          string    `json:"inventory_slot9"`
	InventorySlot9Quantity  int       `json:"inventory_slot9_quantity"`
	InventorySlot10         string    `json:"inventory_slot10"`
	InventorySlot10Quantity int       `json:"inventory_slot10_quantity"`
	InventorySlot11         string    `json:"inventory_slot11"`
	InventorySlot11Quantity int       `json:"inventory_slot11_quantity"`
	InventorySlot12         string    `json:"inventory_slot12"`
	InventorySlot12Quantity int       `json:"inventory_slot12_quantity"`
	InventorySlot13         string    `json:"inventory_slot13"`
	InventorySlot13Quantity int       `json:"inventory_slot13_quantity"`
	InventorySlot14         string    `json:"inventory_slot14"`
	InventorySlot14Quantity int       `json:"inventory_slot14_quantity"`
	InventorySlot15         string    `json:"inventory_slot15"`
	InventorySlot15Quantity int       `json:"inventory_slot15_quantity"`
	InventorySlot16         string    `json:"inventory_slot16"`
	InventorySlot16Quantity int       `json:"inventory_slot16_quantity"`
	InventorySlot17         string    `json:"inventory_slot17"`
	InventorySlot17Quantity int       `json:"inventory_slot17_quantity"`
	InventorySlot18         string    `json:"inventory_slot18"`
	InventorySlot18Quantity int       `json:"inventory_slot18_quantity"`
	InventorySlot19         string    `json:"inventory_slot19"`
	InventorySlot19Quantity int       `json:"inventory_slot19_quantity"`
	InventorySlot20         string    `json:"inventory_slot20"`
	InventorySlot20Quantity int       `json:"inventory_slot20_quantity"`
	InventoryMaxItems       int       `json:"inventory_max_items"`
	Task                    string    `json:"task"`
	TaskType                string    `json:"task_type"`
	TaskProgress            int       `json:"task_progress"`
	TaskTotal               int       `json:"task_total"`
}

// Skin is a custom type used for the allowed skins
type Skin string

// allowed skins
const (
	Man1   Skin = "men1"
	Man2   Skin = "men2"
	Man3   Skin = "men3"
	Woman1 Skin = "women1"
	Woman2 Skin = "women2"
	Woman3 Skin = "women3"
)

// CharacterMovement is a struct that holds info on the movement of a character
type CharacterMovement struct {
	Cooldown    Cooldown
	Destination Destination
	Character   Character
}

// Cooldown is a struct that holds info on the remaining time for a given action
type Cooldown struct {
	TotalSeconds     int       `json:"totalSeconds"`
	RemainingSeconds int       `json:"remainingSeconds"`
	Expiration       time.Time `json:"expiration"`
	Reason           string    `json:"reason"`
}

// Destination is a struct that holds info on a map tile
type Destination struct {
	Name    string `json:"name"`
	X       int    `json:"x"`
	Y       int    `json:"y"`
	Content any    `json:"content"`
}