package slurp

import (
	"context"
)

// Core interfaces for the SLURP contextual intelligence system.
// These interfaces define the contracts for hierarchical context resolution,
// temporal evolution tracking, distributed storage, and intelligent analysis.

// ContextResolver defines the interface for hierarchical context resolution.
//
// The resolver implements bounded hierarchy traversal with caching and
// role-based access control, providing efficient context resolution for
// UCXL addresses through cascading inheritance patterns.
type ContextResolver interface {
	// Resolve resolves context for a UCXL address using cascading inheritance.
	// This is the primary method for context resolution with default depth limits.
	Resolve(ctx context.Context, ucxlAddress string) (*ResolvedContext, error)
	
	// ResolveWithDepth resolves context with bounded depth limit.
	// Provides fine-grained control over hierarchy traversal depth for
	// performance optimization and resource management.
	ResolveWithDepth(ctx context.Context, ucxlAddress string, maxDepth int) (*ResolvedContext, error)
	
	// BatchResolve efficiently resolves multiple UCXL addresses.
	// Uses parallel processing, request deduplication, and shared caching
	// for optimal performance with bulk operations.
	BatchResolve(ctx context.Context, addresses []string) (map[string]*ResolvedContext, error)
	
	// InvalidateCache invalidates cached resolution for an address.
	// Used when underlying context changes to ensure fresh resolution.
	InvalidateCache(ucxlAddress string) error
	
	// InvalidatePattern invalidates cached resolutions matching a pattern.
	// Useful for bulk cache invalidation when hierarchies change.
	InvalidatePattern(pattern string) error
	
	// GetStatistics returns resolver performance and operational statistics.
	GetStatistics() *ResolverStatistics
	
	// SetDepthLimit sets the default depth limit for resolution operations.
	SetDepthLimit(maxDepth int) error
	
	// GetDepthLimit returns the current default depth limit.
	GetDepthLimit() int
	
	// ClearCache clears all cached resolutions.
	ClearCache() error
}

// HierarchyManager manages the context hierarchy with bounded traversal.
//
// Provides operations for maintaining the hierarchical structure of
// context nodes while enforcing depth limits and consistency constraints.
type HierarchyManager interface {
	// LoadHierarchy loads the context hierarchy from storage.
	// Must be called before other operations to initialize the hierarchy.
	LoadHierarchy(ctx context.Context) error
	
	// AddNode adds a context node to the hierarchy.
	// Validates hierarchy constraints and updates relationships.
	AddNode(ctx context.Context, node *ContextNode) error
	
	// UpdateNode updates an existing context node.
	// Preserves hierarchy relationships while updating content.
	UpdateNode(ctx context.Context, node *ContextNode) error
	
	// RemoveNode removes a context node and handles children.
	// Provides options for handling orphaned children (promote, delete, reassign).
	RemoveNode(ctx context.Context, nodeID string) error
	
	// GetNode retrieves a context node by ID.
	GetNode(ctx context.Context, nodeID string) (*ContextNode, error)
	
	// TraverseUp traverses up the hierarchy with bounded depth.
	// Returns ancestor nodes within the specified depth limit.
	TraverseUp(ctx context.Context, startPath string, maxDepth int) ([]*ContextNode, error)
	
	// TraverseDown traverses down the hierarchy with bounded depth.
	// Returns descendant nodes within the specified depth limit.
	TraverseDown(ctx context.Context, startPath string, maxDepth int) ([]*ContextNode, error)
	
	// GetChildren gets immediate children of a node.
	GetChildren(ctx context.Context, nodeID string) ([]*ContextNode, error)
	
	// GetParent gets the immediate parent of a node.
	GetParent(ctx context.Context, nodeID string) (*ContextNode, error)
	
	// GetPath gets the full path from root to a node.
	GetPath(ctx context.Context, nodeID string) ([]*ContextNode, error)
	
	// ValidateHierarchy validates hierarchy integrity and constraints.
	// Checks for cycles, orphans, and consistency violations.
	ValidateHierarchy(ctx context.Context) error
	
	// RebuildIndex rebuilds internal indexes for hierarchy operations.
	RebuildIndex(ctx context.Context) error
	
	// GetHierarchyStats returns statistics about the hierarchy.
	GetHierarchyStats(ctx context.Context) (*HierarchyStats, error)
}

// GlobalContextManager manages global contexts that apply everywhere.
//
// Global contexts provide system-wide applicable metadata that is
// automatically included in all context resolutions regardless of
// hierarchy position.
type GlobalContextManager interface {
	// AddGlobalContext adds a context that applies globally.
	// Global contexts are merged into all resolution results.
	AddGlobalContext(ctx context.Context, context *ContextNode) error
	
	// RemoveGlobalContext removes a global context.
	RemoveGlobalContext(ctx context.Context, contextID string) error
	
	// UpdateGlobalContext updates an existing global context.
	UpdateGlobalContext(ctx context.Context, context *ContextNode) error
	
	// ListGlobalContexts lists all global contexts.
	// Returns contexts ordered by priority/specificity.
	ListGlobalContexts(ctx context.Context) ([]*ContextNode, error)
	
	// GetGlobalContext retrieves a specific global context.
	GetGlobalContext(ctx context.Context, contextID string) (*ContextNode, error)
	
	// ApplyGlobalContexts applies global contexts to a resolution.
	// Called automatically during resolution process.
	ApplyGlobalContexts(ctx context.Context, resolved *ResolvedContext) error
	
	// EnableGlobalContext enables/disables a global context.
	EnableGlobalContext(ctx context.Context, contextID string, enabled bool) error
	
	// SetGlobalContextPriority sets priority for global context application.
	SetGlobalContextPriority(ctx context.Context, contextID string, priority int) error
}

// TemporalGraph manages the temporal evolution of context.
//
// Implements decision-hop based temporal analysis for tracking how
// context evolves through different decision points rather than
// simple chronological progression.
type TemporalGraph interface {
	// CreateInitialContext creates the first version of context.
	// Establishes the starting point for temporal evolution tracking.
	CreateInitialContext(ctx context.Context, ucxlAddress string, 
	                    contextData *ContextNode, creator string) (*TemporalNode, error)
	
	// EvolveContext creates a new temporal version due to a decision.
	// Records the decision that caused the change and updates the graph.
	EvolveContext(ctx context.Context, ucxlAddress string, 
	             newContext *ContextNode, reason ChangeReason, 
	             decision *DecisionMetadata) (*TemporalNode, error)
	
	// GetLatestVersion gets the most recent temporal node.
	GetLatestVersion(ctx context.Context, ucxlAddress string) (*TemporalNode, error)
	
	// GetVersionAtDecision gets context as it was at a specific decision point.
	// Navigation based on decision hops, not chronological time.
	GetVersionAtDecision(ctx context.Context, ucxlAddress string, 
	                    decisionHop int) (*TemporalNode, error)
	
	// GetEvolutionHistory gets complete evolution history.
	// Returns all temporal versions ordered by decision sequence.
	GetEvolutionHistory(ctx context.Context, ucxlAddress string) ([]*TemporalNode, error)
	
	// AddInfluenceRelationship adds influence between contexts.
	// Establishes that decisions in one context affect another.
	AddInfluenceRelationship(ctx context.Context, influencer, influenced string) error
	
	// RemoveInfluenceRelationship removes an influence relationship.
	RemoveInfluenceRelationship(ctx context.Context, influencer, influenced string) error
	
	// GetInfluenceRelationships gets all influence relationships for a context.
	GetInfluenceRelationships(ctx context.Context, ucxlAddress string) ([]string, []string, error)
	
	// FindRelatedDecisions finds decisions within N decision hops.
	// Explores the decision graph by conceptual distance, not time.
	FindRelatedDecisions(ctx context.Context, ucxlAddress string, 
	                    maxHops int) ([]*DecisionPath, error)
	
	// FindDecisionPath finds shortest decision path between addresses.
	// Returns the path of decisions connecting two contexts.
	FindDecisionPath(ctx context.Context, from, to string) ([]*DecisionStep, error)
	
	// AnalyzeDecisionPatterns analyzes decision-making patterns.
	// Identifies patterns in how decisions are made and contexts evolve.
	AnalyzeDecisionPatterns(ctx context.Context) (*DecisionAnalysis, error)
	
	// ValidateTemporalIntegrity validates temporal graph integrity.
	// Checks for inconsistencies and corruption in temporal data.
	ValidateTemporalIntegrity(ctx context.Context) error
	
	// CompactHistory compacts old temporal data to save space.
	// Removes detailed history while preserving key decision points.
	CompactHistory(ctx context.Context, beforeTime *time.Time) error
}

// DecisionNavigator handles decision-hop based navigation.
//
// Provides navigation through the decision graph based on conceptual
// distance rather than chronological time, enabling exploration of
// related changes and decision sequences.
type DecisionNavigator interface {
	// NavigateDecisionHops navigates by decision distance, not time.
	// Moves through the decision graph by the specified number of hops.
	NavigateDecisionHops(ctx context.Context, ucxlAddress string, 
	                    hops int, direction NavigationDirection) (*TemporalNode, error)
	
	// GetDecisionTimeline gets timeline ordered by decision sequence.
	// Returns decisions in the order they were made, not chronological order.
	GetDecisionTimeline(ctx context.Context, ucxlAddress string, 
	                   includeRelated bool, maxHops int) (*DecisionTimeline, error)
	
	// FindStaleContexts finds contexts that may be outdated.
	// Identifies contexts that haven't been updated despite related changes.
	FindStaleContexts(ctx context.Context, stalenessThreshold float64) ([]*StaleContext, error)
	
	// ValidateDecisionPath validates a decision path is reachable.
	// Verifies that a path exists and is traversable.
	ValidateDecisionPath(ctx context.Context, path []*DecisionStep) error
	
	// GetNavigationHistory gets navigation history for a session.
	GetNavigationHistory(ctx context.Context, sessionID string) ([]*DecisionStep, error)
	
	// ResetNavigation resets navigation state to latest versions.
	ResetNavigation(ctx context.Context, ucxlAddress string) error
}

// DistributedStorage handles distributed storage of context data.
//
// Provides encrypted, role-based storage using the existing BZZZ DHT
// infrastructure with consistency guarantees and conflict resolution.
type DistributedStorage interface {
	// Store stores context data in the DHT with encryption.
	// Data is encrypted based on access level and role requirements.
	Store(ctx context.Context, key string, data interface{}, 
	      accessLevel crypto.AccessLevel) error
	
	// Retrieve retrieves and decrypts context data.
	// Automatically handles decryption based on current role permissions.
	Retrieve(ctx context.Context, key string) (interface{}, error)
	
	// Delete removes context data from storage.
	// Handles distributed deletion and cleanup.
	Delete(ctx context.Context, key string) error
	
	// Exists checks if a key exists in storage.
	Exists(ctx context.Context, key string) (bool, error)
	
	// List lists keys matching a pattern.
	List(ctx context.Context, pattern string) ([]string, error)
	
	// Index creates searchable indexes for context data.
	// Enables efficient searching and filtering operations.
	Index(ctx context.Context, key string, metadata *IndexMetadata) error
	
	// Search searches indexed context data.
	// Supports complex queries with role-based filtering.
	Search(ctx context.Context, query *SearchQuery) ([]*SearchResult, error)
	
	// Sync synchronizes with other nodes.
	// Ensures consistency across the distributed system.
	Sync(ctx context.Context) error
	
	// GetStorageStats returns storage statistics and health information.
	GetStorageStats(ctx context.Context) (*StorageStats, error)
	
	// Backup creates a backup of stored data.
	Backup(ctx context.Context, destination string) error
	
	// Restore restores data from backup.
	Restore(ctx context.Context, source string) error
}

// EncryptedStorage provides role-based encrypted storage.
//
// Extends basic storage with advanced encryption features including
// multi-role encryption, key rotation, and access control enforcement.
type EncryptedStorage interface {
	// StoreEncrypted stores data encrypted for specific roles.
	// Supports multi-role encryption for shared access.
	StoreEncrypted(ctx context.Context, key string, data interface{}, 
	              roles []string) error
	
	// RetrieveDecrypted retrieves and decrypts data using current role.
	// Automatically selects appropriate decryption key.
	RetrieveDecrypted(ctx context.Context, key string) (interface{}, error)
	
	// CanAccess checks if current role can access data.
	// Validates access without retrieving the actual data.
	CanAccess(ctx context.Context, key string) (bool, error)
	
	// ListAccessibleKeys lists keys accessible to current role.
	// Filters keys based on current role permissions.
	ListAccessibleKeys(ctx context.Context) ([]string, error)
	
	// ReEncryptForRoles re-encrypts data for different roles.
	// Useful for permission changes and access control updates.
	ReEncryptForRoles(ctx context.Context, key string, newRoles []string) error
	
	// GetAccessRoles gets roles that can access a specific key.
	GetAccessRoles(ctx context.Context, key string) ([]string, error)
	
	// RotateKeys rotates encryption keys for enhanced security.
	RotateKeys(ctx context.Context, keyAge time.Duration) error
	
	// ValidateEncryption validates encryption integrity.
	ValidateEncryption(ctx context.Context, key string) error
}

// ContextGenerator generates context metadata (admin-only).
//
// Provides intelligent context generation using analysis of file content,
// structure, patterns, and existing context. Restricted to admin nodes
// to prevent unauthorized context modification.
type ContextGenerator interface {
	// GenerateContext generates context for a path (requires admin role).
	// Analyzes content, structure, and patterns to create comprehensive context.
	GenerateContext(ctx context.Context, path string, 
	               options *GenerationOptions) (*ContextNode, error)
	
	// RegenerateHierarchy regenerates entire hierarchy (admin-only).
	// Rebuilds context hierarchy from scratch with improved analysis.
	RegenerateHierarchy(ctx context.Context, rootPath string,
	                   options *GenerationOptions) (*HierarchyStats, error)
	
	// ValidateGeneration validates generated context quality.
	// Ensures generated context meets quality and consistency standards.
	ValidateGeneration(ctx context.Context, context *ContextNode) (*ValidationResult, error)
	
	// EstimateGenerationCost estimates resource cost of generation.
	// Helps with resource planning and operation scheduling.
	EstimateGenerationCost(ctx context.Context, scope string) (*CostEstimate, error)
	
	// GenerateBatch generates context for multiple paths efficiently.
	// Optimized for bulk generation operations.
	GenerateBatch(ctx context.Context, paths []string, 
	             options *GenerationOptions) (map[string]*ContextNode, error)
	
	// ScheduleGeneration schedules background context generation.
	// Queues generation tasks for processing during low-activity periods.
	ScheduleGeneration(ctx context.Context, paths []string, 
	                  options *GenerationOptions, priority int) error
	
	// GetGenerationStatus gets status of background generation tasks.
	GetGenerationStatus(ctx context.Context) (*GenerationStatus, error)
	
	// CancelGeneration cancels pending generation tasks.
	CancelGeneration(ctx context.Context, taskID string) error
}

// ContextAnalyzer analyzes context data for patterns and quality.
//
// Provides comprehensive analysis of context quality, consistency,
// and patterns to identify improvement opportunities and issues.
type ContextAnalyzer interface {
	// AnalyzeContext analyzes context quality and consistency.
	// Evaluates individual context nodes for quality and accuracy.
	AnalyzeContext(ctx context.Context, context *ContextNode) (*AnalysisResult, error)
	
	// DetectPatterns detects patterns across contexts.
	// Identifies recurring patterns that can improve context generation.
	DetectPatterns(ctx context.Context, contexts []*ContextNode) ([]*Pattern, error)
	
	// SuggestImprovements suggests context improvements.
	// Provides actionable recommendations for context enhancement.
	SuggestImprovements(ctx context.Context, context *ContextNode) ([]*Suggestion, error)
	
	// CalculateConfidence calculates confidence score.
	// Assesses confidence in context accuracy and completeness.
	CalculateConfidence(ctx context.Context, context *ContextNode) (float64, error)
	
	// DetectInconsistencies detects inconsistencies in hierarchy.
	// Identifies conflicts and inconsistencies across related contexts.
	DetectInconsistencies(ctx context.Context) ([]*Inconsistency, error)
	
	// AnalyzeTrends analyzes trends in context evolution.
	// Identifies patterns in how contexts change over time.
	AnalyzeTrends(ctx context.Context, timeRange time.Duration) (*TrendAnalysis, error)
	
	// CompareContexts compares contexts for similarity and differences.
	CompareContexts(ctx context.Context, context1, context2 *ContextNode) (*ComparisonResult, error)
	
	// ValidateConsistency validates consistency across hierarchy.
	ValidateConsistency(ctx context.Context, rootPath string) ([]*ConsistencyIssue, error)
}

// PatternMatcher matches context patterns and templates.
//
// Provides pattern matching capabilities for context standardization,
// template application, and automated context improvement.
type PatternMatcher interface {
	// MatchPatterns matches context against known patterns.
	// Identifies which patterns apply to a given context.
	MatchPatterns(ctx context.Context, context *ContextNode) ([]*PatternMatch, error)
	
	// RegisterPattern registers a new context pattern.
	// Adds patterns that can be used for matching and generation.
	RegisterPattern(ctx context.Context, pattern *ContextPattern) error
	
	// UnregisterPattern removes a context pattern.
	UnregisterPattern(ctx context.Context, patternID string) error
	
	// UpdatePattern updates an existing pattern.
	UpdatePattern(ctx context.Context, pattern *ContextPattern) error
	
	// ListPatterns lists all registered patterns.
	// Returns patterns ordered by priority and usage frequency.
	ListPatterns(ctx context.Context) ([]*ContextPattern, error)
	
	// GetPattern retrieves a specific pattern.
	GetPattern(ctx context.Context, patternID string) (*ContextPattern, error)
	
	// ApplyPattern applies a pattern to context.
	// Updates context to match pattern template.
	ApplyPattern(ctx context.Context, context *ContextNode, patternID string) (*ContextNode, error)
	
	// ValidatePattern validates pattern definition.
	ValidatePattern(ctx context.Context, pattern *ContextPattern) (*ValidationResult, error)
	
	// GetPatternUsage gets usage statistics for patterns.
	GetPatternUsage(ctx context.Context) (map[string]int, error)
}

// QueryEngine provides context search and query interfaces.
//
// Enables complex querying of context data with support for full-text
// search, faceted search, temporal queries, and role-based filtering.
type QueryEngine interface {
	// Query performs a general context query.
	// Supports complex queries with multiple criteria and filters.
	Query(ctx context.Context, query *SearchQuery) ([]*SearchResult, error)
	
	// SearchByTag finds contexts by tag.
	// Optimized search for tag-based filtering.
	SearchByTag(ctx context.Context, tags []string) ([]*SearchResult, error)
	
	// SearchByTechnology finds contexts by technology.
	// Finds contexts using specific technologies.
	SearchByTechnology(ctx context.Context, technologies []string) ([]*SearchResult, error)
	
	// SearchByPath finds contexts by path pattern.
	// Supports glob patterns and regex for path matching.
	SearchByPath(ctx context.Context, pathPattern string) ([]*SearchResult, error)
	
	// TemporalQuery performs temporal-aware queries.
	// Queries context as it existed at specific decision points.
	TemporalQuery(ctx context.Context, query *SearchQuery, 
	             temporal *TemporalFilter) ([]*SearchResult, error)
	
	// FuzzySearch performs fuzzy text search.
	// Handles typos and approximate matching.
	FuzzySearch(ctx context.Context, text string, threshold float64) ([]*SearchResult, error)
	
	// GetSuggestions gets search suggestions and auto-complete.
	GetSuggestions(ctx context.Context, prefix string, limit int) ([]string, error)
	
	// GetFacets gets faceted search information.
	// Returns available filters and their counts.
	GetFacets(ctx context.Context, query *SearchQuery) (map[string]map[string]int, error)
	
	// BuildIndex builds search indexes for efficient querying.
	BuildIndex(ctx context.Context, rebuild bool) error
	
	// OptimizeIndex optimizes search indexes for performance.
	OptimizeIndex(ctx context.Context) error
	
	// GetQueryStats gets query performance statistics.
	GetQueryStats(ctx context.Context) (*QueryStats, error)
}

// Additional supporting interfaces for comprehensive functionality

// CacheManager manages caching for performance optimization
type CacheManager interface {
	Get(ctx context.Context, key string) (interface{}, error)
	Set(ctx context.Context, key string, value interface{}, ttl time.Duration) error
	Delete(ctx context.Context, key string) error
	Clear(ctx context.Context) error
	GetStats() *CacheStats
}

// EventEmitter emits events for monitoring and integration
type EventEmitter interface {
	Emit(ctx context.Context, eventType EventType, data map[string]interface{}) error
	Subscribe(eventType EventType, handler EventHandler) error
	Unsubscribe(eventType EventType, handler EventHandler) error
}

// HealthChecker provides health checking capabilities
type HealthChecker interface {
	CheckHealth(ctx context.Context) (*HealthStatus, error)
	GetComponentHealth(ctx context.Context, component string) (*ComponentHealth, error)
	RegisterHealthCheck(component string, checker func(context.Context) error) error
}

// Additional types needed by interfaces

import "time"

type StorageStats struct {
	TotalKeys        int64         `json:"total_keys"`
	TotalSize        int64         `json:"total_size"`
	IndexSize        int64         `json:"index_size"`
	CacheSize        int64         `json:"cache_size"`
	ReplicationStatus string       `json:"replication_status"`
	LastSync         time.Time     `json:"last_sync"`
	SyncErrors       int64         `json:"sync_errors"`
	AvailableSpace   int64         `json:"available_space"`
}

type GenerationStatus struct {
	ActiveTasks      int           `json:"active_tasks"`
	QueuedTasks      int           `json:"queued_tasks"`
	CompletedTasks   int           `json:"completed_tasks"`
	FailedTasks      int           `json:"failed_tasks"`
	EstimatedCompletion time.Time  `json:"estimated_completion"`
	CurrentTask      *GenerationTask `json:"current_task,omitempty"`
}

type GenerationTask struct {
	ID           string        `json:"id"`
	Path         string        `json:"path"`
	Status       string        `json:"status"`
	Progress     float64       `json:"progress"`
	StartedAt    time.Time     `json:"started_at"`
	EstimatedCompletion time.Time `json:"estimated_completion"`
	Error        string        `json:"error,omitempty"`
}

type TrendAnalysis struct {
	TimeRange        time.Duration `json:"time_range"`
	TotalChanges     int          `json:"total_changes"`
	ChangeVelocity   float64      `json:"change_velocity"`
	DominantReasons  []ChangeReason `json:"dominant_reasons"`
	QualityTrend     string       `json:"quality_trend"`
	ConfidenceTrend  string       `json:"confidence_trend"`
	MostActiveAreas  []string     `json:"most_active_areas"`
	EmergingPatterns []*Pattern   `json:"emerging_patterns"`
	AnalyzedAt       time.Time    `json:"analyzed_at"`
}

type ComparisonResult struct {
	SimilarityScore  float64      `json:"similarity_score"`
	Differences      []*Difference `json:"differences"`
	CommonElements   []string     `json:"common_elements"`
	Recommendations  []*Suggestion `json:"recommendations"`
	ComparedAt       time.Time    `json:"compared_at"`
}

type Difference struct {
	Field        string      `json:"field"`
	Value1       interface{} `json:"value1"`
	Value2       interface{} `json:"value2"`
	DifferenceType string    `json:"difference_type"`
	Significance float64     `json:"significance"`
}

type ConsistencyIssue struct {
	Type         string    `json:"type"`
	Description  string    `json:"description"`
	AffectedNodes []string `json:"affected_nodes"`
	Severity     string    `json:"severity"`
	Suggestion   string    `json:"suggestion"`
	DetectedAt   time.Time `json:"detected_at"`
}

type QueryStats struct {
	TotalQueries     int64         `json:"total_queries"`
	AverageQueryTime time.Duration `json:"average_query_time"`
	CacheHitRate     float64       `json:"cache_hit_rate"`
	IndexUsage       map[string]int64 `json:"index_usage"`
	PopularQueries   []string      `json:"popular_queries"`
	SlowQueries      []string      `json:"slow_queries"`
	ErrorRate        float64       `json:"error_rate"`
}

type CacheStats struct {
	HitRate      float64   `json:"hit_rate"`
	MissRate     float64   `json:"miss_rate"`
	TotalHits    int64     `json:"total_hits"`
	TotalMisses  int64     `json:"total_misses"`
	CurrentSize  int64     `json:"current_size"`
	MaxSize      int64     `json:"max_size"`
	Evictions    int64     `json:"evictions"`
	LastEviction time.Time `json:"last_eviction"`
}

type HealthStatus struct {
	Overall     string                      `json:"overall"`
	Components  map[string]*ComponentHealth `json:"components"`
	CheckedAt   time.Time                   `json:"checked_at"`
	Version     string                      `json:"version"`
	Uptime      time.Duration               `json:"uptime"`
}

type ComponentHealth struct {
	Status      string            `json:"status"`
	Message     string            `json:"message,omitempty"`
	LastCheck   time.Time         `json:"last_check"`
	ResponseTime time.Duration    `json:"response_time"`
	Metadata    map[string]interface{} `json:"metadata,omitempty"`
}