import Foundation

public struct SystemSnapshot: Equatable, Sendable {
    public var cpuTemperatureCelsius: Double?
    public var gpuTemperatureCelsius: Double?
    public var memoryPressureFraction: Double
    public var memoryPressureLevel: MemoryPressureLevel
    public var thermalState: SystemThermalState
    public var capturedAt: Date

    public init(
        cpuTemperatureCelsius: Double?,
        gpuTemperatureCelsius: Double?,
        memoryPressureFraction: Double,
        memoryPressureLevel: MemoryPressureLevel,
        thermalState: SystemThermalState,
        capturedAt: Date = Date())
    {
        self.cpuTemperatureCelsius = cpuTemperatureCelsius
        self.gpuTemperatureCelsius = gpuTemperatureCelsius
        self.memoryPressureFraction = memoryPressureFraction
        self.memoryPressureLevel = memoryPressureLevel
        self.thermalState = thermalState
        self.capturedAt = capturedAt
    }
}

public enum SystemThermalState: String, CaseIterable, Equatable, Sendable {
    case nominal
    case fair
    case serious
    case critical

    public init(_ processInfoState: ProcessInfo.ThermalState) {
        switch processInfoState {
        case .nominal:
            self = .nominal
        case .fair:
            self = .fair
        case .serious:
            self = .serious
        case .critical:
            self = .critical
        @unknown default:
            self = .serious
        }
    }
}

public enum MemoryPressureLevel: String, CaseIterable, Equatable, Sendable {
    case normal
    case warning
    case critical

    public init(kernelValue: Int32) {
        switch kernelValue {
        case 2:
            self = .warning
        case 4:
            self = .critical
        default:
            self = .normal
        }
    }
}
