package monitoring

import "time"

// LogEntry represents a single log entry captured from zerolog
type LogEntry struct {
	ID        string         `json:"id"`
	Timestamp time.Time      `json:"timestamp"`
	Level     string         `json:"level"`   // debug, info, warn, error, fatal
	Message   string         `json:"message"`
	Caller    string         `json:"caller"`  // file:line
	Process   string         `json:"process"` // "api" or "worker"
	Fields    map[string]any `json:"fields"`  // Additional structured fields
}

// SystemStats contains all system and runtime statistics
type SystemStats struct {
	Timestamp time.Time    `json:"timestamp"`
	Process   string       `json:"process"`
	CPU       CPUStats     `json:"cpu"`
	Memory    MemoryStats  `json:"memory"`
	Disk      DiskStats    `json:"disk"`
	Runtime   RuntimeStats `json:"runtime"`
	HTTP      *HTTPStats   `json:"http,omitempty"`  // API only
	Asynq     *AsynqStats  `json:"asynq,omitempty"` // Worker only
}

// CPUStats contains CPU usage information
type CPUStats struct {
	UsagePercent float64 `json:"usage_percent"`
	NumCPU       int     `json:"num_cpu"`
	LoadAvg1     float64 `json:"load_avg_1"`
	LoadAvg5     float64 `json:"load_avg_5"`
	LoadAvg15    float64 `json:"load_avg_15"`
}

// MemoryStats contains both system and Go runtime memory info
type MemoryStats struct {
	// System memory
	UsedBytes    uint64  `json:"used_bytes"`
	TotalBytes   uint64  `json:"total_bytes"`
	UsagePercent float64 `json:"usage_percent"`
	// Go heap
	HeapAlloc uint64 `json:"heap_alloc"`
	HeapSys   uint64 `json:"heap_sys"`
	HeapInuse uint64 `json:"heap_inuse"`
}

// DiskStats contains disk usage information
type DiskStats struct {
	UsedBytes    uint64  `json:"used_bytes"`
	TotalBytes   uint64  `json:"total_bytes"`
	FreeBytes    uint64  `json:"free_bytes"`
	UsagePercent float64 `json:"usage_percent"`
}

// RuntimeStats contains Go runtime information
type RuntimeStats struct {
	Goroutines  int    `json:"goroutines"`
	NumGC       uint32 `json:"num_gc"`
	LastGCPause uint64 `json:"last_gc_pause_ns"`
	Uptime      int64  `json:"uptime_seconds"`
}

// HTTPStats contains HTTP request metrics (API server only)
type HTTPStats struct {
	RequestsTotal     int64                    `json:"requests_total"`
	RequestsPerMinute float64                  `json:"requests_per_minute"`
	AvgLatencyMs      float64                  `json:"avg_latency_ms"`
	ErrorRate         float64                  `json:"error_rate"`
	ByEndpoint        map[string]EndpointStats `json:"by_endpoint"`
	ByStatusCode      map[int]int64            `json:"by_status_code"`
}

// EndpointStats contains per-endpoint HTTP metrics
type EndpointStats struct {
	Count        int64   `json:"count"`
	AvgLatencyMs float64 `json:"avg_latency_ms"`
	P95LatencyMs float64 `json:"p95_latency_ms"`
	ErrorRate    float64 `json:"error_rate"`
}

// AsynqStats contains Asynq job queue metrics (Worker only)
type AsynqStats struct {
	Queues map[string]QueueStats `json:"queues"`
}

// QueueStats contains stats for a single Asynq queue
type QueueStats struct {
	Pending   int `json:"pending"`
	Active    int `json:"active"`
	Scheduled int `json:"scheduled"`
	Retry     int `json:"retry"`
	Archived  int `json:"archived"`
	Completed int `json:"completed"`
	Failed    int `json:"failed"`
}

// LogFilters for querying logs
type LogFilters struct {
	Level   string `form:"level"`
	Process string `form:"process"`
	Search  string `form:"search"`
	Limit   int    `form:"limit,default=100"`
}

// GetLimit returns the limit with bounds checking
func (f *LogFilters) GetLimit() int {
	if f.Limit <= 0 {
		return 100
	}
	if f.Limit > 1000 {
		return 1000
	}
	return f.Limit
}

// WebSocket message types
const (
	WSMessageTypeLog   = "log"
	WSMessageTypeStats = "stats"
)

// WSMessage wraps messages sent over WebSocket
type WSMessage struct {
	Type string `json:"type"` // "log" or "stats"
	Data any    `json:"data"`
}
