package traits

// Trait group constants defining the categories of traits
const (
	TraitsAttributes = 0 // Attribute-based traits (STR, STA, etc.)
	TraitsCombat     = 1 // Combat-related traits
	TraitsNoncombat  = 2 // Non-combat utility traits
	TraitsPools      = 3 // Health/Power/Concentration pool traits
	TraitsResist     = 4 // Resistance-based traits
	TraitsTradeskill = 5 // Tradeskill-related traits
)

// Trait type packet constants for client communication
const (
	PacketTypeEnemyMastery        = 0 // Enemy mastery abilities
	PacketTypeSpecializedTraining = 1 // Specialized training abilities
	PacketTypeCharacterTrait      = 2 // Character traits
	PacketTypeRacialTradition     = 3 // Racial tradition abilities
)

// Trait selection level requirements - classic EverQuest II progression
// Based on the comment in the C++ code describing the official trait progression

// PersonalTraitLevelLimits defines when each personal trait becomes available
var PersonalTraitLevelLimits = []int16{0, 8, 14, 22, 28, 36, 42, 46, 48}

// TrainingTraitLevelLimits defines when each training ability becomes available
var TrainingTraitLevelLimits = []int16{0, 10, 20, 30, 40, 50}

// RacialTraitLevelLimits defines when each racial tradition becomes available
var RacialTraitLevelLimits = []int16{0, 18, 26, 34, 44}

// CharacterTraitLevelLimits defines when each character trait (enemy tactic) becomes available
var CharacterTraitLevelLimits = []int16{0, 12, 16, 24, 32, 38}

// Classic trait progression schedule as documented in the C++ code:
//
// Level 8:  Personal Trait (1st)
// Level 10: Training (1st)
// Level 12: Enemy Tactic (1st)
// Level 14: Personal Trait (2nd)
// Level 16: Enemy Tactic (2nd)
// Level 18: Racial Tradition (1st)
// Level 20: Training (2nd)
// Level 22: Personal Trait (3rd)
// Level 24: Enemy Tactic (3rd)
// Level 26: Racial Tradition (2nd)
// Level 28: Personal Trait (4th)
// Level 30: Training (3rd)
// Level 32: Enemy Tactic (4th)
// Level 34: Racial Tradition (3rd)
// Level 36: Personal Trait (5th)
// Level 38: Enemy Tactic (5th)
// Level 40: Training (4th)
// Level 42: Personal Trait (6th)
// Level 44: Racial Tradition (4th)
// Level 46: Personal Trait (7th)
// Level 48: Personal Trait (8th)
// Level 50: Training (5th)

// Default trait selection levels for non-classic mode
const (
	DefaultFocusSelectLevel     = 9  // Every 9 levels for focus effects
	DefaultTrainingSelectLevel  = 10 // Every 10 levels for training abilities
	DefaultRaceSelectLevel      = 10 // Every 10 levels for racial abilities
	DefaultCharacterSelectLevel = 4  // Every 4 levels for character traits
)

// Trait packet field limits
const (
	MaxTraitsPerLine = 5 // Maximum number of traits that can be displayed per line in UI
)

// Trait name categories for UI display
var TraitGroupNames = map[int8]string{
	TraitsAttributes: "Attributes",
	TraitsCombat:     "Combat",
	TraitsNoncombat:  "Noncombat",
	TraitsPools:      "Pools",
	TraitsResist:     "Resist",
	TraitsTradeskill: "Tradeskill",
}

// Validation constants
const (
	MaxTraitNameLength = 250 // Maximum length for trait names
	UniversalClassReq  = -1  // Class requirement value meaning "any class"
	UniversalRaceReq   = -1  // Race requirement value meaning "any race"
	UnassignedGroupID  = -1  // Group ID for unassigned/default group
)

// Packet filling constants for empty trait slots
const (
	EmptyTraitIcon    = 65535      // 0xFFFF - indicates empty trait slot
	EmptyTraitID      = 0xFFFFFFFF // 0xFFFFFFFF - indicates empty trait ID
	EmptyTraitUnknown = 0xFFFFFFFF // 0xFFFFFFFF - unknown field for empty traits
)

// Client version constants for trait packet compatibility
const (
	FocusEffectsMinVersion = 1188 // Minimum client version that supports focus effects
)

// Rule names for trait system configuration
const (
	RuleTraitTieringSelection     = "TraitTieringSelection"     // Enable/disable tiered selection
	RuleClassicTraitLevelTable    = "ClassicTraitLevelTable"    // Use classic level requirements
	RuleTraitFocusSelectLevel     = "TraitFocusSelectLevel"     // Level interval for focus effects
	RuleTraitTrainingSelectLevel  = "TraitTrainingSelectLevel"  // Level interval for training
	RuleTraitRaceSelectLevel      = "TraitRaceSelectLevel"      // Level interval for racial traits
	RuleTraitCharacterSelectLevel = "TraitCharacterSelectLevel" // Level interval for character traits
)

// Log category constants
const (
	LogCategoryTraits = "Traits"
)

// Trait selection state constants
const (
	TraitNotSelected = 0 // Trait is not selected by player
	TraitSelected    = 1 // Trait is selected by player
)

// Default trait selection logic constants
const (
	DefaultUnknownField1 = 1 // Default value for unknown packet field 1
	DefaultUnknownField2 = 1 // Default value for unknown packet field 2
)
