package exporter

// ReanimatorExport represents the top-level structure for Reanimator format export
type ReanimatorExport struct {
	Filename    string             `json:"filename"`
	SourceType  string             `json:"source_type,omitempty"`
	Protocol    string             `json:"protocol,omitempty"`
	TargetHost  string             `json:"target_host,omitempty"`
	CollectedAt string             `json:"collected_at"` // RFC3339 format
	Hardware    ReanimatorHardware `json:"hardware"`
}

// ReanimatorHardware contains all hardware components
type ReanimatorHardware struct {
	Board         ReanimatorBoard      `json:"board"`
	Firmware      []ReanimatorFirmware `json:"firmware,omitempty"`
	CPUs          []ReanimatorCPU      `json:"cpus,omitempty"`
	Memory        []ReanimatorMemory   `json:"memory,omitempty"`
	Storage       []ReanimatorStorage  `json:"storage,omitempty"`
	PCIeDevices   []ReanimatorPCIe     `json:"pcie_devices,omitempty"`
	PowerSupplies []ReanimatorPSU      `json:"power_supplies,omitempty"`
	Sensors       *ReanimatorSensors   `json:"sensors,omitempty"`
	EventLogs     []ReanimatorEventLog `json:"event_logs,omitempty"`
}

// ReanimatorBoard represents motherboard/server information
type ReanimatorBoard 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"`
}

// ReanimatorFirmware represents firmware version information
type ReanimatorFirmware struct {
	DeviceName string `json:"device_name"`
	Version    string `json:"version"`
}

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

// ReanimatorCPU represents processor information
type ReanimatorCPU struct {
	Socket                  int                            `json:"socket"`
	Model                   string                         `json:"model,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"`
	SerialNumber            string                         `json:"serial_number,omitempty"`
	Firmware                string                         `json:"firmware,omitempty"`
	Present                 *bool                          `json:"present,omitempty"`
	Manufacturer            string                         `json:"manufacturer,omitempty"`
	Status                  string                         `json:"status,omitempty"`
	StatusCheckedAt         string                         `json:"status_checked_at,omitempty"`
	StatusChangedAt         string                         `json:"status_changed_at,omitempty"`
	ManufacturedYearWeek    string                         `json:"manufactured_year_week,omitempty"`
	StatusHistory           []ReanimatorStatusHistoryEntry `json:"status_history,omitempty"`
	ErrorDescription        string                         `json:"error_description,omitempty"`
}

// ReanimatorMemory represents a memory module (DIMM)
type ReanimatorMemory struct {
	Slot                       string                         `json:"slot"`
	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"`
	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"`
	Manufacturer               string                         `json:"manufacturer,omitempty"`
	SerialNumber               string                         `json:"serial_number,omitempty"`
	PartNumber                 string                         `json:"part_number,omitempty"`
	Status                     string                         `json:"status,omitempty"`
	StatusCheckedAt            string                         `json:"status_checked_at,omitempty"`
	StatusChangedAt            string                         `json:"status_changed_at,omitempty"`
	ManufacturedYearWeek       string                         `json:"manufactured_year_week,omitempty"`
	StatusHistory              []ReanimatorStatusHistoryEntry `json:"status_history,omitempty"`
	ErrorDescription           string                         `json:"error_description,omitempty"`
}

// ReanimatorStorage represents a storage device
type ReanimatorStorage struct {
	Slot                  string                         `json:"slot"`
	Type                  string                         `json:"type,omitempty"`
	Model                 string                         `json:"model"`
	SizeGB                int                            `json:"size_gb,omitempty"`
	SerialNumber          string                         `json:"serial_number"`
	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"`
	RemainingEndurancePct *int                           `json:"remaining_endurance_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"`
	Status                string                         `json:"status,omitempty"`
	StatusCheckedAt       string                         `json:"status_checked_at,omitempty"`
	StatusChangedAt       string                         `json:"status_changed_at,omitempty"`
	ManufacturedYearWeek  string                         `json:"manufactured_year_week,omitempty"`
	StatusHistory         []ReanimatorStatusHistoryEntry `json:"status_history,omitempty"`
	ErrorDescription      string                         `json:"error_description,omitempty"`
}

// ReanimatorPCIe represents a PCIe device
type ReanimatorPCIe struct {
	Slot                   string                         `json:"slot"`
	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"`
	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"`
	MACAddresses           []string                       `json:"mac_addresses,omitempty"`
	Present                *bool                          `json:"present,omitempty"`
	SerialNumber           string                         `json:"serial_number,omitempty"`
	Firmware               string                         `json:"firmware,omitempty"`
	Status                 string                         `json:"status,omitempty"`
	StatusCheckedAt        string                         `json:"status_checked_at,omitempty"`
	StatusChangedAt        string                         `json:"status_changed_at,omitempty"`
	ManufacturedYearWeek   string                         `json:"manufactured_year_week,omitempty"`
	StatusHistory          []ReanimatorStatusHistoryEntry `json:"status_history,omitempty"`
	ErrorDescription       string                         `json:"error_description,omitempty"`
}

// ReanimatorPSU represents a power supply unit
type ReanimatorPSU struct {
	Slot                 string                         `json:"slot"`
	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"`
	Status               string                         `json:"status,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"`
	StatusCheckedAt      string                         `json:"status_checked_at,omitempty"`
	StatusChangedAt      string                         `json:"status_changed_at,omitempty"`
	ManufacturedYearWeek string                         `json:"manufactured_year_week,omitempty"`
	StatusHistory        []ReanimatorStatusHistoryEntry `json:"status_history,omitempty"`
	ErrorDescription     string                         `json:"error_description,omitempty"`
}

type ReanimatorEventLog 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"`
}

type ReanimatorSensors struct {
	Fans         []ReanimatorFanSensor         `json:"fans,omitempty"`
	Power        []ReanimatorPowerSensor       `json:"power,omitempty"`
	Temperatures []ReanimatorTemperatureSensor `json:"temperatures,omitempty"`
	Other        []ReanimatorOtherSensor       `json:"other,omitempty"`
}

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

type ReanimatorPowerSensor 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 ReanimatorTemperatureSensor 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 ReanimatorOtherSensor 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"`
}
