package pathfinder

// PathfinderZoneIntegration defines the interface for zone integration
type PathfinderZoneIntegration interface {
	// GetZoneName returns the zone name
	GetZoneName() string
	
	// IsValidPosition checks if a position is valid for pathfinding
	IsValidPosition(position [3]float32) bool
	
	// GetGroundZ returns the ground Z coordinate at the given X,Y position
	GetGroundZ(x, y float32) float32
	
	// IsInWater checks if a position is in water
	IsInWater(position [3]float32) bool
	
	// IsInLava checks if a position is in lava
	IsInLava(position [3]float32) bool
	
	// IsInPvP checks if a position is in a PvP area
	IsInPvP(position [3]float32) bool
}

// PathfinderClientIntegration defines the interface for client notifications
type PathfinderClientIntegration interface {
	// NotifyPathGenerated notifies clients about generated paths (for debugging)
	NotifyPathGenerated(path *Path, clientID int32)
	
	// SendPathUpdate sends path updates to clients
	SendPathUpdate(spawnID int32, path *Path)
}

// PathfinderStatistics defines the interface for statistics collection
type PathfinderStatistics interface {
	// RecordPathRequest records a pathfinding request
	RecordPathRequest(duration float64, success bool, partial bool)
	
	// GetPathfindingStats returns current statistics
	GetPathfindingStats() *PathfindingStats
	
	// ResetPathfindingStats resets all statistics
	ResetPathfindingStats()
}

// PathfindingAdapter provides integration with the zone system
type PathfindingAdapter struct {
	zoneIntegration   PathfinderZoneIntegration
	clientIntegration PathfinderClientIntegration
	statistics        PathfinderStatistics
}

// NewPathfindingAdapter creates a new pathfinding adapter
func NewPathfindingAdapter(zone PathfinderZoneIntegration, client PathfinderClientIntegration, stats PathfinderStatistics) *PathfindingAdapter {
	return &PathfindingAdapter{
		zoneIntegration:   zone,
		clientIntegration: client,
		statistics:        stats,
	}
}

// GetZoneIntegration returns the zone integration interface
func (pa *PathfindingAdapter) GetZoneIntegration() PathfinderZoneIntegration {
	return pa.zoneIntegration
}

// GetClientIntegration returns the client integration interface
func (pa *PathfindingAdapter) GetClientIntegration() PathfinderClientIntegration {
	return pa.clientIntegration
}

// GetStatistics returns the statistics interface
func (pa *PathfindingAdapter) GetStatistics() PathfinderStatistics {
	return pa.statistics
}

// PathfindingLoader defines the interface for loading pathfinding data
type PathfindingLoader interface {
	// LoadPathfindingData loads pathfinding data for a zone
	LoadPathfindingData(zoneName string) (PathfindingBackend, error)
	
	// GetSupportedBackends returns a list of supported pathfinding backends
	GetSupportedBackends() []string
	
	// CreateBackend creates a pathfinding backend of the specified type
	CreateBackend(backendType string, zoneName string) (PathfindingBackend, error)
}