// Package schema defines the HardwareIngestRequest types compatible with
// core/internal/ingest/parser_hardware.go. No import dependency on core.
package schema

// HardwareIngestRequest is the top-level output document produced by `bee audit`.
// It is accepted as-is by the core /api/ingest/hardware endpoint.
type HardwareIngestRequest struct {
	Filename    *string          `json:"filename,omitempty"`
	SourceType  *string          `json:"source_type,omitempty"`
	Protocol    *string          `json:"protocol,omitempty"`
	TargetHost  *string          `json:"target_host,omitempty"`
	CollectedAt string           `json:"collected_at"`
	Runtime     *RuntimeHealth   `json:"runtime,omitempty"`
	Hardware    HardwareSnapshot `json:"hardware"`
}

type RuntimeHealth struct {
	Status        string `json:"status"`
	CheckedAt     string `json:"checked_at"`
	ExportDir     string `json:"export_dir,omitempty"`
	DriverReady   bool   `json:"driver_ready,omitempty"`
	CUDAReady     bool   `json:"cuda_ready,omitempty"`
	NvidiaGSPMode string `json:"nvidia_gsp_mode,omitempty"` // "gsp-on", "gsp-off", "gsp-stuck"
	NetworkStatus string `json:"network_status,omitempty"`
	// ToRAMStatus: "ok" (fully in RAM), "warning" (not copied), "partial" (stale/incomplete copy exists), "failed" (toram active but copy failed)
	ToRAMStatus string `json:"toram_status,omitempty"`
	// USBExportPath: mount point of the first writable USB drive found, empty if none.
	USBExportPath string                 `json:"usb_export_path,omitempty"`
	Issues        []RuntimeIssue         `json:"issues,omitempty"`
	Tools         []RuntimeToolStatus    `json:"tools,omitempty"`
	Services      []RuntimeServiceStatus `json:"services,omitempty"`
	Interfaces    []RuntimeInterface     `json:"interfaces,omitempty"`
}

type RuntimeIssue struct {
	Code        string `json:"code"`
	Severity    string `json:"severity,omitempty"`
	Description string `json:"description"`
}

type RuntimeToolStatus struct {
	Name string `json:"name"`
	Path string `json:"path,omitempty"`
	OK   bool   `json:"ok"`
}

type RuntimeServiceStatus struct {
	Name   string `json:"name"`
	Status string `json:"status"`
}

type RuntimeInterface struct {
	Name    string   `json:"name"`
	State   string   `json:"state,omitempty"`
	IPv4    []string `json:"ipv4,omitempty"`
	Outcome string   `json:"outcome,omitempty"`
}

type HardwareSnapshot struct {
	Board         HardwareBoard            `json:"board"`
	Firmware      []HardwareFirmwareRecord `json:"firmware,omitempty"`
	CPUs          []HardwareCPU            `json:"cpus,omitempty"`
	Memory        []HardwareMemory         `json:"memory,omitempty"`
	Storage       []HardwareStorage        `json:"storage,omitempty"`
	PCIeDevices   []HardwarePCIeDevice     `json:"pcie_devices,omitempty"`
	PowerSupplies []HardwarePowerSupply    `json:"power_supplies,omitempty"`
	Sensors       *HardwareSensors         `json:"sensors,omitempty"`
	EventLogs     []HardwareEventLog       `json:"event_logs,omitempty"`
}

type HardwareHealthSummary struct {
	Status      string   `json:"status"`
	Warnings    []string `json:"warnings,omitempty"`
	Failures    []string `json:"failures,omitempty"`
	StorageWarn int      `json:"storage_warn,omitempty"`
	StorageFail int      `json:"storage_fail,omitempty"`
	PCIeWarn    int      `json:"pcie_warn,omitempty"`
	PCIeFail    int      `json:"pcie_fail,omitempty"`
	PSUWarn     int      `json:"psu_warn,omitempty"`
	PSUFail     int      `json:"psu_fail,omitempty"`
	MemoryWarn  int      `json:"memory_warn,omitempty"`
	MemoryFail  int      `json:"memory_fail,omitempty"`
	EmptyDIMMs  int      `json:"empty_dimms,omitempty"`
	MissingPSUs int      `json:"missing_psus,omitempty"`
	CollectedAt string   `json:"collected_at,omitempty"`
}

type HardwareBoard struct {
	Manufacturer *string `json:"manufacturer,omitempty"`
	ProductName  *string `json:"product_name,omitempty"`
	SerialNumber string  `json:"serial_number"`
	PartNumber   *string `json:"part_number,omitempty"`
	UUID         *string `json:"uuid,omitempty"`
}

type HardwareFirmwareRecord struct {
	DeviceName string `json:"device_name"`
	Version    string `json:"version"`
}

type HardwareCPU struct {
	HardwareComponentStatus
	Socket                  *int     `json:"socket,omitempty"`
	Model                   *string  `json:"model,omitempty"`
	Manufacturer            *string  `json:"manufacturer,omitempty"`
	SerialNumber            *string  `json:"serial_number,omitempty"`
	Firmware                *string  `json:"firmware,omitempty"`
	Cores                   *int     `json:"cores,omitempty"`
	Threads                 *int     `json:"threads,omitempty"`
	FrequencyMHz            *int     `json:"frequency_mhz,omitempty"`
	MaxFrequencyMHz         *int     `json:"max_frequency_mhz,omitempty"`
	TemperatureC            *float64 `json:"temperature_c,omitempty"`
	PowerW                  *float64 `json:"power_w,omitempty"`
	Throttled               *bool    `json:"throttled,omitempty"`
	CorrectableErrorCount   *int64   `json:"correctable_error_count,omitempty"`
	UncorrectableErrorCount *int64   `json:"uncorrectable_error_count,omitempty"`
	LifeRemainingPct        *float64 `json:"life_remaining_pct,omitempty"`
	LifeUsedPct             *float64 `json:"life_used_pct,omitempty"`
	Present                 *bool    `json:"present,omitempty"`
}

type HardwareMemory struct {
	HardwareComponentStatus
	Slot                       *string  `json:"slot,omitempty"`
	Location                   *string  `json:"location,omitempty"`
	Present                    *bool    `json:"present,omitempty"`
	SizeMB                     *int     `json:"size_mb,omitempty"`
	Type                       *string  `json:"type,omitempty"`
	MaxSpeedMHz                *int     `json:"max_speed_mhz,omitempty"`
	CurrentSpeedMHz            *int     `json:"current_speed_mhz,omitempty"`
	Manufacturer               *string  `json:"manufacturer,omitempty"`
	SerialNumber               *string  `json:"serial_number,omitempty"`
	PartNumber                 *string  `json:"part_number,omitempty"`
	TemperatureC               *float64 `json:"temperature_c,omitempty"`
	CorrectableECCErrorCount   *int64   `json:"correctable_ecc_error_count,omitempty"`
	UncorrectableECCErrorCount *int64   `json:"uncorrectable_ecc_error_count,omitempty"`
	LifeRemainingPct           *float64 `json:"life_remaining_pct,omitempty"`
	LifeUsedPct                *float64 `json:"life_used_pct,omitempty"`
	SpareBlocksRemainingPct    *float64 `json:"spare_blocks_remaining_pct,omitempty"`
	PerformanceDegraded        *bool    `json:"performance_degraded,omitempty"`
	DataLossDetected           *bool    `json:"data_loss_detected,omitempty"`
}

type HardwareStorage struct {
	HardwareComponentStatus
	Slot                  *string        `json:"slot,omitempty"`
	Type                  *string        `json:"type,omitempty"`
	Model                 *string        `json:"model,omitempty"`
	SizeGB                *int           `json:"size_gb,omitempty"`
	SerialNumber          *string        `json:"serial_number,omitempty"`
	Manufacturer          *string        `json:"manufacturer,omitempty"`
	Firmware              *string        `json:"firmware,omitempty"`
	Interface             *string        `json:"interface,omitempty"`
	Present               *bool          `json:"present,omitempty"`
	TemperatureC          *float64       `json:"temperature_c,omitempty"`
	PowerOnHours          *int64         `json:"power_on_hours,omitempty"`
	PowerCycles           *int64         `json:"power_cycles,omitempty"`
	UnsafeShutdowns       *int64         `json:"unsafe_shutdowns,omitempty"`
	MediaErrors           *int64         `json:"media_errors,omitempty"`
	ErrorLogEntries       *int64         `json:"error_log_entries,omitempty"`
	WrittenBytes          *int64         `json:"written_bytes,omitempty"`
	ReadBytes             *int64         `json:"read_bytes,omitempty"`
	LifeUsedPct           *float64       `json:"life_used_pct,omitempty"`
	LifeRemainingPct      *float64       `json:"life_remaining_pct,omitempty"`
	AvailableSparePct     *float64       `json:"available_spare_pct,omitempty"`
	ReallocatedSectors    *int64         `json:"reallocated_sectors,omitempty"`
	CurrentPendingSectors *int64         `json:"current_pending_sectors,omitempty"`
	OfflineUncorrectable  *int64         `json:"offline_uncorrectable,omitempty"`
	Telemetry             map[string]any `json:"-"`
}

type HardwarePCIeDevice struct {
	HardwareComponentStatus
	Slot                   *string        `json:"slot,omitempty"`
	VendorID               *int           `json:"vendor_id,omitempty"`
	DeviceID               *int           `json:"device_id,omitempty"`
	NUMANode               *int           `json:"numa_node,omitempty"`
	TemperatureC           *float64       `json:"temperature_c,omitempty"`
	PowerW                 *float64       `json:"power_w,omitempty"`
	LifeRemainingPct       *float64       `json:"life_remaining_pct,omitempty"`
	LifeUsedPct            *float64       `json:"life_used_pct,omitempty"`
	ECCCorrectedTotal      *int64         `json:"ecc_corrected_total,omitempty"`
	ECCUncorrectedTotal    *int64         `json:"ecc_uncorrected_total,omitempty"`
	HWSlowdown             *bool          `json:"hw_slowdown,omitempty"`
	BatteryChargePct       *float64       `json:"battery_charge_pct,omitempty"`
	BatteryHealthPct       *float64       `json:"battery_health_pct,omitempty"`
	BatteryTemperatureC    *float64       `json:"battery_temperature_c,omitempty"`
	BatteryVoltageV        *float64       `json:"battery_voltage_v,omitempty"`
	BatteryReplaceRequired *bool          `json:"battery_replace_required,omitempty"`
	SFPPresent             *bool          `json:"sfp_present,omitempty"`
	SFPIdentifier          *string        `json:"sfp_identifier,omitempty"`
	SFPConnector           *string        `json:"sfp_connector,omitempty"`
	SFPVendor              *string        `json:"sfp_vendor,omitempty"`
	SFPPartNumber          *string        `json:"sfp_part_number,omitempty"`
	SFPSerialNumber        *string        `json:"sfp_serial_number,omitempty"`
	SFPWavelengthNM        *float64       `json:"sfp_wavelength_nm,omitempty"`
	SFPTemperatureC        *float64       `json:"sfp_temperature_c,omitempty"`
	SFPTXPowerDBM          *float64       `json:"sfp_tx_power_dbm,omitempty"`
	SFPRXPowerDBM          *float64       `json:"sfp_rx_power_dbm,omitempty"`
	SFPVoltageV            *float64       `json:"sfp_voltage_v,omitempty"`
	SFPBiasMA              *float64       `json:"sfp_bias_ma,omitempty"`
	BDF                    *string        `json:"-"`
	DeviceClass            *string        `json:"device_class,omitempty"`
	Manufacturer           *string        `json:"manufacturer,omitempty"`
	Model                  *string        `json:"model,omitempty"`
	LinkWidth              *int           `json:"link_width,omitempty"`
	LinkSpeed              *string        `json:"link_speed,omitempty"`
	MaxLinkWidth           *int           `json:"max_link_width,omitempty"`
	MaxLinkSpeed           *string        `json:"max_link_speed,omitempty"`
	SerialNumber           *string        `json:"serial_number,omitempty"`
	Firmware               *string        `json:"firmware,omitempty"`
	MacAddresses           []string       `json:"mac_addresses,omitempty"`
	Present                *bool          `json:"present,omitempty"`
	Telemetry              map[string]any `json:"-"`
}

type HardwarePowerSupply struct {
	HardwareComponentStatus
	Slot             *string  `json:"slot,omitempty"`
	Present          *bool    `json:"present,omitempty"`
	Model            *string  `json:"model,omitempty"`
	Vendor           *string  `json:"vendor,omitempty"`
	WattageW         *int     `json:"wattage_w,omitempty"`
	SerialNumber     *string  `json:"serial_number,omitempty"`
	PartNumber       *string  `json:"part_number,omitempty"`
	Firmware         *string  `json:"firmware,omitempty"`
	InputType        *string  `json:"input_type,omitempty"`
	InputPowerW      *float64 `json:"input_power_w,omitempty"`
	OutputPowerW     *float64 `json:"output_power_w,omitempty"`
	InputVoltage     *float64 `json:"input_voltage,omitempty"`
	TemperatureC     *float64 `json:"temperature_c,omitempty"`
	LifeRemainingPct *float64 `json:"life_remaining_pct,omitempty"`
	LifeUsedPct      *float64 `json:"life_used_pct,omitempty"`
}

type HardwareComponentStatus struct {
	Status               *string                 `json:"status,omitempty"`
	StatusCheckedAt      *string                 `json:"status_checked_at,omitempty"`
	StatusChangedAt      *string                 `json:"status_changed_at,omitempty"`
	StatusHistory        []HardwareStatusHistory `json:"status_history,omitempty"`
	ErrorDescription     *string                 `json:"error_description,omitempty"`
	ManufacturedYearWeek *string                 `json:"manufactured_year_week,omitempty"`
}

type HardwareStatusHistory struct {
	Status    string  `json:"status"`
	ChangedAt string  `json:"changed_at"`
	Details   *string `json:"details,omitempty"`
}

type HardwareSensors struct {
	Fans         []HardwareFanSensor         `json:"fans,omitempty"`
	Power        []HardwarePowerSensor       `json:"power,omitempty"`
	Temperatures []HardwareTemperatureSensor `json:"temperatures,omitempty"`
	Other        []HardwareOtherSensor       `json:"other,omitempty"`
}

type HardwareFanSensor struct {
	Name     string  `json:"name"`
	Location *string `json:"location,omitempty"`
	RPM      *int    `json:"rpm,omitempty"`
	Status   *string `json:"status,omitempty"`
}

type HardwarePowerSensor struct {
	Name     string   `json:"name"`
	Location *string  `json:"location,omitempty"`
	VoltageV *float64 `json:"voltage_v,omitempty"`
	CurrentA *float64 `json:"current_a,omitempty"`
	PowerW   *float64 `json:"power_w,omitempty"`
	Status   *string  `json:"status,omitempty"`
}

type HardwareTemperatureSensor struct {
	Name                     string   `json:"name"`
	Location                 *string  `json:"location,omitempty"`
	Celsius                  *float64 `json:"celsius,omitempty"`
	ThresholdWarningCelsius  *float64 `json:"threshold_warning_celsius,omitempty"`
	ThresholdCriticalCelsius *float64 `json:"threshold_critical_celsius,omitempty"`
	Status                   *string  `json:"status,omitempty"`
}

type HardwareOtherSensor struct {
	Name     string   `json:"name"`
	Location *string  `json:"location,omitempty"`
	Value    *float64 `json:"value,omitempty"`
	Unit     *string  `json:"unit,omitempty"`
	Status   *string  `json:"status,omitempty"`
}

type HardwareEventLog struct {
	Source       string         `json:"source"`
	EventTime    *string        `json:"event_time,omitempty"`
	Severity     *string        `json:"severity,omitempty"`
	MessageID    *string        `json:"message_id,omitempty"`
	Message      string         `json:"message"`
	ComponentRef *string        `json:"component_ref,omitempty"`
	Fingerprint  *string        `json:"fingerprint,omitempty"`
	IsActive     *bool          `json:"is_active,omitempty"`
	RawPayload   map[string]any `json:"raw_payload,omitempty"`
}
