package common

type EQ2DataType int

// Constants matching data_struct.hpp exactly
const (
	TypeNone EQ2DataType = iota
	TypeInt8
	TypeInt16
	TypeInt32
	TypeInt64
	TypeFloat
	TypeDouble
	TypeColor
	TypeSInt8
	TypeSInt16
	TypeSInt32
	TypeChar
	TypeString8
	TypeString16
	TypeString32
	TypeEquipment
	TypeArray
	TypeItem
	TypeSInt64
)

type EQ2Color struct {
	Red   int8
	Green int8
	Blue  int8
}

type EQ2EquipmentItem struct {
	Type      uint16
	Color     EQ2Color
	Highlight EQ2Color
}

type EQ2String8 struct {
	Size int8
	Data string
}

type EQ2String16 struct {
	Size int16
	Data string
}

type EQ2String32 struct {
	Size int32
	Data string
}

const (
	SlotPrimary = iota
	SlotSecondary
	SlotHead
	SlotChest
	SlotShoulders
	SlotForearms
	SlotHands
	SlotLegs
	SlotFeet
	SlotLeftRing
	SlotRightRing
	SlotEars
	SlotNeck
	SlotLeftWrist
	SlotRightWrist
	SlotRanged
	SlotAmmo
	SlotWaist
	SlotActivate1
	SlotActivate2
	SlotTextures
	SlotHair
	SlotBeard
	SlotNakedChest
	SlotNakedLegs
)

type EQ2Equipment struct {
	EquipID   [25]int16    // Equipment item IDs for each slot
	Color     [25]EQ2Color // Primary colors for each equipment slot
	Highlight [25]EQ2Color // Highlight colors for each equipment slot
}

type CharFeatures struct {
	HairType         int16   // Hair style type
	HairFaceType     int16   // Facial hair type
	WingType         int16   // Wing type (for races with wings)
	ChestType        int16   // Chest appearance type
	LegsType         int16   // Leg appearance type
	EyeType          [3]int8 // Eye shape variations
	EarType          [3]int8 // Ear shape variations
	EyeBrowType      [3]int8 // Eyebrow shape variations
	CheekType        [3]int8 // Cheek shape variations
	LipType          [3]int8 // Lip shape variations
	ChinType         [3]int8 // Chin shape variations
	NoseType         [3]int8 // Nose shape variations
	BodySize         int8    // Body size modifier
	BodyAge          int8    // Body age appearance
	SogaEyeType      [3]int8 // SOGA eye shape variations
	SogaEarType      [3]int8 // SOGA ear shape variations
	SogaEyeBrowType  [3]int8 // SOGA eyebrow shape variations
	SogaCheekType    [3]int8 // SOGA cheek shape variations
	SogaChestType    int16   // SOGA chest appearance type
	SogaLegsType     int16   // SOGA leg appearance type
	SogaLipType      [3]int8 // SOGA lip shape variations
	SogaChinType     [3]int8 // SOGA chin shape variations
	SogaNoseType     [3]int8 // SOGA nose shape variations
	SogaBodySize     int8    // SOGA body size modifier
	SogaBodyAge      int8    // SOGA body age appearance
	SogaHairType     int16   // SOGA hair style type
	SogaHairFaceType int16   // SOGA facial hair type
	CombatVoice      int16   // Combat voice type
	EmoteVoice       int16   // Emote voice type
	MountModelType   int16   // Mount model type

	MountSaddleColor           EQ2Color // Mount saddle color
	MountColor                 EQ2Color // Mount body color
	SkinColor                  EQ2Color // Skin color
	EyeColor                   EQ2Color // Eye color
	HairTypeColor              EQ2Color // Primary hair color
	HairTypeHighlightColor     EQ2Color // Hair highlight color
	HairFaceColor              EQ2Color // Facial hair color
	HairFaceHighlightColor     EQ2Color // Facial hair highlight color
	HairHighlightColor         EQ2Color // Hair highlight color
	WingColor1                 EQ2Color // Wing primary color
	WingColor2                 EQ2Color // Wing secondary color
	ShirtColor                 EQ2Color // Shirt color
	PantsColor                 EQ2Color // Pants color
	HairColor1                 EQ2Color // Hair primary color
	HairColor2                 EQ2Color // Hair secondary color
	SogaSkinColor              EQ2Color // SOGA skin color
	SogaEyeColor               EQ2Color // SOGA eye color
	SogaHairColor1             EQ2Color // SOGA hair primary color
	SogaHairColor2             EQ2Color // SOGA hair secondary color
	SogaHairTypeColor          EQ2Color // SOGA primary hair color
	SogaHairTypeHighlightColor EQ2Color // SOGA hair highlight color
	SogaHairFaceColor          EQ2Color // SOGA facial hair color
	SogaHairFaceHighlightColor EQ2Color // SOGA facial hair highlight color
	SogaHairHighlightColor     EQ2Color // SOGA hair highlight color
	ModelColor                 EQ2Color // Model color
	SogaModelColor             EQ2Color // SOGA model color
}

type PositionData struct {
	GridID           int32   // Current grid identifier
	BadGridID        int32   // Invalid grid identifier
	Speed1           int8    // Primary speed value
	Speed2           int8    // Secondary speed value
	Dir1             int16   // Primary direction
	Dir2             int16   // Secondary direction
	Pitch1           int16   // Primary pitch angle
	Pitch2           int16   // Secondary pitch angle
	Roll             int16   // Roll angle
	X                float32 // X coordinate
	Y                float32 // Y coordinate
	Z                float32 // Z coordinate
	X2               float32 // Secondary X coordinate
	Y2               float32 // Secondary Y coordinate
	Z2               float32 // Secondary Z coordinate
	X3               float32 // Tertiary X coordinate
	Y3               float32 // Tertiary Y coordinate
	Z3               float32 // Tertiary Z coordinate
	SpawnOrigX       float32 // Original spawn X coordinate
	SpawnOrigY       float32 // Original spawn Y coordinate
	SpawnOrigZ       float32 // Original spawn Z coordinate
	SpawnOrigHeading float32 // Original spawn heading
	SpawnOrigPitch   float32 // Original spawn pitch
	SpawnOrigRoll    float32 // Original spawn roll
	SpeedX           float32 // X-axis speed
	SpeedY           float32 // Y-axis speed
	SpeedZ           float32 // Z-axis speed
	SideSpeed        float32 // Lateral movement speed
	VertSpeed        float32 // Vertical movement speed
	ClientHeading1   float32 // Client-side heading (primary)
	ClientHeading2   float32 // Client-side heading (secondary)
	ClientPitch      float32 // Client-side pitch
	CollisionRadius  int16   // Collision detection radius
	State            int16   // Current movement state
}

type AppearanceData struct {
	Pos             PositionData // Position and movement data
	ModelType       int16        // 3D model type identifier
	SogaModelType   int16        // SOGA model type identifier
	ActivityStatus  int16        // Current activity status
	VisualState     int16        // Visual state flags
	ActionState     int16        // Action state flags
	MoodState       int16        // Mood/emotion state
	EmoteState      int16        // Current emote state
	Attackable      int8         // Whether entity can be attacked
	Icon            int8         // Icon type to display
	HideHood        int8         // Whether to hide hood graphics
	ShowLevel       int8         // Whether to show level
	LockedNoLoot    int8         // Locked status with no loot
	QuestFlag       int8         // Quest-related flag
	HeroicFlag      int8         // Heroic opportunity flag
	ShowCommandIcon int8         // Whether to show command icon
	DisplayHandIcon int8         // Whether to show hand cursor icon
	PlayerFlag      int8         // Player character flag
	Targetable      int8         // Whether entity can be targeted
	DisplayName     int8         // Whether to display name
	SubTitle        [255]byte    // Subtitle text (Guild name)
	DisplayHP       int32        // Health percentage (0 = 100%)
	PowerLeft       int32        // Power remaining (bar hidden if >=100)
	AdventureClass  int8         // Adventure class identifier
	TradeskillClass int8         // Tradeskill class identifier
	Level           int8         // Character level
	TradeskillLevel int8         // Tradeskill level
	MinLevel        int8         // Minimum level for encounters
	MaxLevel        int8         // Maximum level for encounters
	Difficulty      int8         // Encounter difficulty rating
	Visible         int16        // Visibility state (02 = normal, 15 = shadow)
	Name            [128]byte    // Entity name
	LastName        [64]byte     // Last name (for players)
	PrefixTitle     [128]byte    // Title prefix
	SuffixTitle     [128]byte    // Title suffix
	Race            int8         // Race identifier
	Gender          int8         // Gender identifier
	Randomize       int32        // Randomization seed
	LuaRaceID       int8         // Lua script race identifier
}
