package zone

import (
	"eq2emu/internal/items"
	"eq2emu/internal/spawn"
)

// Client interface represents a connected player client
type Client interface {
	GetID() uint32
	GetCharacterID() int32
	GetPlayerName() string
	GetPlayer() Player
	GetClientVersion() int32
	IsLoadingZone() bool
	SendPacket(data []byte) error
	GetPosition() (x, y, z, heading float32, zoneID int32)
	SetPosition(x, y, z, heading float32, zoneID int32)
	GetSpawnRange() float32
	IsInCombat() bool
	CanSeeSpawn(spawn *spawn.Spawn) bool
	GetLanguageID() int32
	GetLanguageSkill(languageID int32) int32
}

// Player interface represents the player entity in the game world
type Player interface {
	GetID() uint32
	GetCharacterID() int32
	GetName() string
	GetLevel() int16
	GetRace() int16
	GetClass() int16
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetZoneID() int32
	SetZoneID(zoneID int32)
	IsAlive() bool
	GetHP() int32
	GetMaxHP() int32
	GetPower() int32
	GetMaxPower() int32
	GetSkillValue(skillID int32) int16
	AddExperience(amount int32, skillID int32)
	IsTracking() bool
	GetTrackingType() int8
	GetTrackingDistance() float32
	CanCarryItems(count int) bool
	AddItems(items []*items.Item) error
	AddCoins(amount int32) error
	SendMessage(message string) error
	GetGroupID() int32
	GetRaidID() int32
	IsInGroup() bool
	IsInRaid() bool
	GetVisibleSpawns() map[int32]*spawn.Spawn
	AddVisibleSpawn(spawn *spawn.Spawn)
	RemoveVisibleSpawn(spawnID int32)
	GetFactionValue(factionID int32) int32
	SetFactionValue(factionID int32, value int32)
	GetCompletedQuests() map[int32]bool
	HasQuestCompleted(questID int32) bool
}

// NPC interface represents a non-player character
type NPC interface {
	GetID() int32
	GetDatabaseID() int32
	GetName() string
	GetLevel() int16
	GetRace() int16
	GetClass() int16
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetMaxHP() int32
	GetHP() int32
	SetHP(hp int32)
	GetMaxPower() int32
	GetPower() int32
	SetPower(power int32)
	IsAlive() bool
	GetLootTableID() int32
	GetFactionID() int32
	GetSkills() map[int32]int16
	GetEquipment() map[int32]int32
	GetBrain() NPCBrain
	SetBrain(brain NPCBrain)
	GetAggroList() map[uint32]int32
	AddAggro(playerID uint32, amount int32)
	RemoveAggro(playerID uint32)
	GetMostHated() uint32
	IsInCombat() bool
	CanAttack(target *spawn.Spawn) bool
	GetMovementLocations() []*MovementLocation
	SetMovementLocations(locations []*MovementLocation)
	GetRespawnTime() int32
	SetRespawnTime(seconds int32)
	GetSpawnGroupID() int32
	SetSpawnGroupID(groupID int32)
	GetRandomizedFeatures() map[string]interface{}
	SetRandomizedFeatures(features map[string]interface{})
}

// Object interface represents an interactive world object
type Object interface {
	GetID() int32
	GetDatabaseID() int32
	GetName() string
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetAppearanceID() int32
	GetSize() float32
	GetDeviceID() int32
	GetCommands() []string
	CanInteract(player Player) bool
	OnInteract(player Player, command string) error
	Copy() Object
}

// Widget interface represents interactive widgets like doors and lifts
type Widget interface {
	GetID() int32
	GetDatabaseID() int32
	GetName() string
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetAppearanceID() int32
	GetWidgetType() int8
	IsOpen() bool
	SetOpen(open bool)
	GetOpenTime() int32
	GetCloseTime() int32
	GetLinkedSpawnID() int32
	GetActionSpawnID() int32
	GetHouseID() int32
	CanInteract(player Player) bool
	OnInteract(player Player) error
	Copy() Widget
}

// Sign interface represents readable signs in the world
type Sign interface {
	GetID() int32
	GetDatabaseID() int32
	GetName() string
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetAppearanceID() int32
	GetTitle() string
	GetDescription() string
	GetSignType() int8
	GetZoneID() int32
	GetWidgetID() int32
	CanRead(player Player) bool
	OnRead(player Player) error
	Copy() Sign
}

// GroundSpawn interface represents harvestable ground spawns
type GroundSpawn interface {
	GetID() int32
	GetDatabaseID() int32
	GetName() string
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetAppearanceID() int32
	GetHarvestType() int8
	GetNumAttempts() int8
	GetMaxAttempts() int8
	GetRespawnTime() int32
	GetSkillRequired() int16
	GetLevelRequired() int16
	CanHarvest(player Player) bool
	OnHarvest(player Player) error
	GetRareTable() int32
	GetBonusTable() int32
	Copy() GroundSpawn
}

// NPCBrain interface represents NPC AI behavior
type NPCBrain interface {
	Think(npc NPC, zone *ZoneServer) error
	OnAggro(npc NPC, attacker *spawn.Spawn) error
	OnDeath(npc NPC, killer *spawn.Spawn) error
	OnSpawn(npc NPC) error
	OnDespawn(npc NPC) error
	GetBrainType() int8
}

// IPathfinder interface for pathfinding systems
type IPathfinder interface {
	CalculatePath(startX, startY, startZ, endX, endY, endZ float32) ([]*PathNode, error)
	GetRandomLocation(x, y, z, radius float32) (newX, newY, newZ float32, err error)
	IsLocationAccessible(x, y, z float32) bool
	GetClosestPoint(x, y, z float32) (closestX, closestY, closestZ float32)
}

// Map interface represents zone collision and height data
type Map interface {
	FindBestZ(x, y, z float32) (bestZ float32, found bool)
	FindClosestZ(x, y, z float32) float32
	CheckLoS(x1, y1, z1, x2, y2, z2 float32) bool
	DoCollisionCheck(x1, y1, z1, x2, y2, z2 float32) (hit bool, hitX, hitY, hitZ float32)
	LineIntersectsZone(x1, y1, z1, x2, y2, z2 float32) bool
	IsLoaded() bool
	GetMapVersion() int32
	GetBounds() (minX, minY, minZ, maxX, maxY, maxZ float32)
}

// RegionMap interface for zone region management
type RegionMap interface {
	InWater(x, y, z float32) (inWater bool, waterType int8)
	InLava(x, y, z float32) bool
	InPvP(x, y, z float32) bool
	InZoneLine(x, y, z float32) (inZoneLine bool, zoneLineID int32)
	GetRegionType(x, y, z, heading float32) int32
	GetEnvironmentalDamage(x, y, z float32) int32
	IsValidLocation(x, y, z float32) bool
}

// SpellProcess interface for spell processing
type SpellProcess interface {
	ProcessSpell(spell Spell, caster Entity, target *spawn.Spawn) error
	InterruptSpell(caster Entity, interruptor *spawn.Spawn) error
	AddSpellTimer(caster Entity, spellID int32, duration int32) error
	RemoveSpellTimer(caster Entity, spellID int32) error
	GetActiveSpells(entity Entity) map[int32]*ActiveSpell
	ProcessSpellEffects() error
	LockSpells(entity Entity)
	UnlockSpells(entity Entity)
	IsSpellLocked(entity Entity) bool
}

// TradeskillManager interface for tradeskill processing
type TradeskillManager interface {
	StartCrafting(player Player, recipeID int32) error
	ProcessCrafting(player Player) error
	CompleteCrafting(player Player) error
	CancelCrafting(player Player) error
	GetRecipe(recipeID int32) Recipe
	GetPlayerRecipes(playerID uint32) []int32
	CanCraftRecipe(player Player, recipeID int32) bool
}

// Entity interface represents any combatable entity
type Entity interface {
	GetID() uint32
	GetName() string
	GetLevel() int16
	GetRace() int16
	GetClass() int16
	GetPosition() (x, y, z, heading float32)
	SetPosition(x, y, z, heading float32)
	GetHP() int32
	GetMaxHP() int32
	SetHP(hp int32)
	GetPower() int32
	GetMaxPower() int32
	SetPower(power int32)
	IsAlive() bool
	TakeDamage(amount int32, attacker Entity, damageType int8) error
	Heal(amount int32, healer Entity) error
	GetResists() map[int8]int16
	GetStats() map[int8]int32
	GetSkillValue(skillID int32) int16
	GetSpellEffects() map[int32]*SpellEffect
	AddSpellEffect(effect *SpellEffect) error
	RemoveSpellEffect(effectID int32) error
	CanCast() bool
	StartCasting(spell Spell) error
	InterruptCasting() error
}

// Spell interface represents a castable spell
type Spell interface {
	GetID() int32
	GetName() string
	GetDescription() string
	GetCastTime() int16
	GetRecoveryTime() int16
	GetRecastTime() int32
	GetRange() float32
	GetRadius() float32
	GetPowerCost() int16
	GetHPCost() int16
	GetTargetType() int8
	GetSpellType() int8
	GetLevel() int16
	GetTier() int8
	GetIcon() int16
	GetEffects() []*SpellEffect
	CanCast(caster Entity, target *spawn.Spawn) bool
	GetRequiredComponents() map[int32]int16
}

// SpellEffect interface represents an active spell effect
type SpellEffect interface {
	GetID() int32
	GetSpellID() int32
	GetEffectType() int8
	GetSubType() int8
	GetValue() float32
	GetDuration() int32
	GetRemainingTime() int32
	GetCasterID() uint32
	GetTargetID() uint32
	IsExpired() bool
	Apply(target Entity) error
	Remove(target Entity) error
	Tick(target Entity) error
}

// ActiveSpell represents a spell being cast or maintained
type ActiveSpell interface {
	GetSpell() Spell
	GetCaster() Entity
	GetTargets() []*spawn.Spawn
	GetCastTime() int32
	GetRemainingCastTime() int32
	IsChanneling() bool
	IsMaintained() bool
	GetEndTime() int64
}

// Recipe interface for tradeskill recipes
type Recipe interface {
	GetID() int32
	GetName() string
	GetDescription() string
	GetSkillID() int32
	GetRequiredLevel() int16
	GetDifficulty() int16
	GetComponents() map[int32]int16
	GetProducts() map[int32]int16
	GetExperience() int32
}

// MovementLocation represents a movement waypoint for NPCs
type MovementLocation struct {
	X         float32
	Y         float32
	Z         float32
	Heading   float32
	Speed     float32
	Delay     int32
	MovementType int8
}

// PathNode represents a single node in a calculated path
type PathNode struct {
	X float32
	Y float32
	Z float32
}

// SpawnLocation represents a spawn point configuration
type SpawnLocation struct {
	ID               int32
	X                float32
	Y                float32  
	Z                float32
	Heading          float32
	Pitch            float32
	Roll             float32
	SpawnType        int8
	SpawnEntry       *SpawnEntry
	RespawnTime      int32
	ExpireTime       int32
	ExpireOffset     int32
	Conditions       int8
	ConditionalValue int32
	SpawnPercentage  float32
	Groups           []int32
}

// SpawnEntry contains the template data for spawns
type SpawnEntry struct {
	ID             int32
	SpawnType      int8
	SpawnEntryID   int32
	Name           string
	Level          int16
	EncounterLevel int16
	Model          string
	Size           float32
	HP             int32
	Power          int32
	Heroic         int8
	Gender         int8
	Race           int16
	AdventureClass int16
	TradeskillClass int16
	AttackType     int8
	MinLevel       int16
	MaxLevel       int16
	EncounterType  int8
	ShowName       int8
	Targetable     int8
	ShowLevel      int8
	Command        string
	LootTier       int8
	MinGold        int32
	MaxGold        int32
	HarvestType    string
	Icon           int32
}

// EntityCommand represents an available command for an entity
type EntityCommand struct {
	ID           int32
	Name         string
	Distance     float32
	ErrorText    string
	CastTime     int16
	SpellVisual  int32
	Command      string
	DisplayText  string
}

// LootTable represents a loot table configuration
type LootTable struct {
	ID                  int32
	Name                string
	MinCoin             int32
	MaxCoin             int32
	MaxLootItems        int16
	LootDropProbability float32
	CoinProbability     float32
	Drops               []*LootDrop
}

// LootDrop represents an individual item drop in a loot table
type LootDrop struct {
	LootTableID            int32
	ItemID                 int32
	ItemCharges           int16
	EquipItem             bool
	Probability           float32
	NoDropQuestCompletedID int32
}

// GlobalLoot represents global loot rules
type GlobalLoot struct {
	Type     string
	TableID  int32
	MinLevel int8
	MaxLevel int8
	RaceID   int16
	ZoneID   int32
	LootTier int32
}

// TransportDestination represents a transport destination
type TransportDestination struct {
	ID              int32
	Type            int8
	Name            string
	Message         string
	DestinationZoneID int32
	DestinationX    float32
	DestinationY    float32
	DestinationZ    float32
	DestinationHeading float32
	Cost            int32
	UniqueID        int32
	MinLevel        int8
	MaxLevel        int8
	QuestRequired   int32
	QuestStepRequired int16
	QuestCompleted  int32
	MapX            int32
	MapY            int32
	ExpansionFlag   int32
	HolidayFlag     int32
	MinClientVersion int32
	MaxClientVersion int32
	FlightPathID    int32
	MountID         int16
	MountRedColor   int8
	MountGreenColor int8
	MountBlueColor  int8
}

// LocationTransportDestination represents a location-based transport trigger
type LocationTransportDestination struct {
	ZoneID            int32
	Message           string
	TriggerX          float32
	TriggerY          float32
	TriggerZ          float32
	TriggerRadius     float32
	DestinationZoneID int32
	DestinationX      float32
	DestinationY      float32
	DestinationZ      float32
	DestinationHeading float32
	Cost              int32
	UniqueID          int32
	ForceZone         bool
}

// Location represents a discoverable location
type Location struct {
	ID   int32
	Name string
	X    float32
	Y    float32
	Z    float32
}

// Item placeholder - should import from items package
type Item = items.Item