package models

import (
	"time"

	"go.mongodb.org/mongo-driver/v2/bson"
)

type PackageUpdate struct {
	Name           string `bson:"name" json:"name"`
	CurrentVersion string `bson:"current_version,omitempty" json:"current_version,omitempty"`
	NewVersion     string `bson:"new_version" json:"new_version"`
}

type CPUInfo struct {
	Model    string  `bson:"model,omitempty" json:"model,omitempty"`
	Cores    int     `bson:"cores,omitempty" json:"cores,omitempty"`
	UsagePct float64 `bson:"usage_pct" json:"usage_pct"`
	Load1    float64 `bson:"load1,omitempty" json:"load1,omitempty"`
}

type MemInfo struct {
	TotalBytes uint64 `bson:"total_bytes" json:"total_bytes"`
	UsedBytes  uint64 `bson:"used_bytes" json:"used_bytes"`
}

type Partition struct {
	Device     string `bson:"device" json:"device"`
	Mountpoint string `bson:"mountpoint" json:"mountpoint"`
	Fstype     string `bson:"fstype,omitempty" json:"fstype,omitempty"`
	TotalBytes uint64 `bson:"total_bytes" json:"total_bytes"`
	UsedBytes  uint64 `bson:"used_bytes" json:"used_bytes"`
}

type Inventory struct {
	CPU            CPUInfo     `bson:"cpu" json:"cpu"`
	Memory         MemInfo     `bson:"memory" json:"memory"`
	SwapTotalBytes uint64      `bson:"swap_total_bytes" json:"swap_total_bytes"`
	SwapUsedBytes  uint64      `bson:"swap_used_bytes" json:"swap_used_bytes"`
	Partitions     []Partition `bson:"partitions,omitempty" json:"partitions,omitempty"`
	Kernel         string      `bson:"kernel,omitempty" json:"kernel,omitempty"`
	MetricsAt      *time.Time  `bson:"metrics_at,omitempty" json:"metrics_at,omitempty"`
	StaticAt       *time.Time  `bson:"static_at,omitempty" json:"static_at,omitempty"`
}

type Server struct {
	ID               bson.ObjectID     `bson:"_id,omitempty" json:"_id,omitempty"`
	InstanceID       string            `bson:"instance_id" json:"instance_id"`
	ServerID         string            `bson:"server_id" json:"server_id"`
	Hostname         string            `bson:"hostname" json:"hostname"`
	IPAddress        string            `bson:"ip_address" json:"ip_address"`
	OSInfo           string            `bson:"os_info" json:"os_info"`
	OSType           string            `bson:"os_type,omitempty" json:"os_type,omitempty"`
	ConsoleProtocols []string          `bson:"console_protocols,omitempty" json:"console_protocols,omitempty"`
	SSHPort          int               `bson:"ssh_port,omitempty" json:"ssh_port,omitempty"`
	RDPPort          int               `bson:"rdp_port,omitempty" json:"rdp_port,omitempty"`
	PreRegToken      string            `bson:"pre_reg_token,omitempty" json:"pre_reg_token,omitempty"`
	PreRegExpires    *time.Time        `bson:"pre_reg_expires,omitempty" json:"pre_reg_expires,omitempty"`
	AgentTokenHash   string            `bson:"agent_token_hash,omitempty" json:"-"`
	Status           string            `bson:"status" json:"status"`
	AgentVersion     string            `bson:"agent_version,omitempty" json:"agent_version,omitempty"`
	LastSeen         *time.Time        `bson:"last_seen,omitempty" json:"last_seen,omitempty"`
	AvailableUpdates []PackageUpdate   `bson:"available_updates,omitempty" json:"available_updates,omitempty"`
	UpdatesCheckedAt *time.Time        `bson:"updates_checked_at,omitempty" json:"updates_checked_at,omitempty"`
	Inventory        *Inventory        `bson:"inventory,omitempty" json:"inventory,omitempty"`
	Tags             map[string]string `bson:"tags,omitempty" json:"tags,omitempty"`
	CreatedAt        time.Time         `bson:"created_at" json:"created_at"`
}
