package models

import (
	"time"
	"github.com/google/uuid"
)

// MetricsReportRequest is sent by agents when reporting system/storage metrics
type MetricsReportRequest struct {
	CommandID string    `json:"command_id"`
	Timestamp time.Time `json:"timestamp"`
	Metrics   []Metric  `json:"metrics"`
}

// Metric represents a system or storage metric
type Metric struct {
	PackageType      string            `json:"package_type"`      // "storage", "system", "cpu", "memory"
	PackageName      string            `json:"package_name"`      // mount point, metric name
	CurrentVersion   string            `json:"current_version"`   // current usage, value
	AvailableVersion string            `json:"available_version"` // available space, threshold
	Severity         string            `json:"severity"`          // "low", "moderate", "high"
	RepositorySource string            `json:"repository_source"`
	Metadata         map[string]string `json:"metadata"`
}

// Metric represents a stored metric in the database
type StoredMetric struct {
	ID               uuid.UUID         `json:"id" db:"id"`
	AgentID          uuid.UUID         `json:"agent_id" db:"agent_id"`
	PackageType      string            `json:"package_type" db:"package_type"`
	PackageName      string            `json:"package_name" db:"package_name"`
	CurrentVersion   string            `json:"current_version" db:"current_version"`
	AvailableVersion string            `json:"available_version" db:"available_version"`
	Severity         string            `json:"severity" db:"severity"`
	RepositorySource string            `json:"repository_source" db:"repository_source"`
	Metadata         JSONB             `json:"metadata" db:"metadata"`
	EventType        string            `json:"event_type" db:"event_type"`
	CreatedAt        time.Time         `json:"created_at" db:"created_at"`
}

// MetricFilter represents filtering options for metrics queries
type MetricFilter struct {
	AgentID     *uuid.UUID `json:"agent_id,omitempty"`
	PackageType *string    `json:"package_type,omitempty"`
	Severity    *string    `json:"severity,omitempty"`
	Limit       *int       `json:"limit,omitempty"`
	Offset      *int       `json:"offset,omitempty"`
}

// MetricResult represents the result of a metrics query
type MetricResult struct {
	Metrics []StoredMetric `json:"metrics"`
	Total   int             `json:"total"`
	Page    int             `json:"page"`
	PerPage int             `json:"per_page"`
}

// StorageMetrics represents storage-specific metrics for easier consumption
type StorageMetrics struct {
	MountPoint    string  `json:"mount_point"`
	TotalBytes    int64   `json:"total_bytes"`
	UsedBytes     int64   `json:"used_bytes"`
	AvailableBytes int64  `json:"available_bytes"`
	UsedPercent   float64 `json:"used_percent"`
	Status        string  `json:"status"` // "low", "moderate", "high", "critical"
	LastUpdated   time.Time `json:"last_updated"`
}

// SystemMetrics represents system-specific metrics for easier consumption
type SystemMetrics struct {
	CPUModel      string    `json:"cpu_model"`
	CPUCores      int       `json:"cpu_cores"`
	CPUThreads    int       `json:"cpu_threads"`
	MemoryTotal   int64     `json:"memory_total"`
	MemoryUsed    int64     `json:"memory_used"`
	MemoryPercent float64   `json:"memory_percent"`
	Processes     int       `json:"processes"`
	Uptime        string    `json:"uptime"`
	LoadAverage   []float64 `json:"load_average"`
	LastUpdated   time.Time `json:"last_updated"`
}