import XCTest
@testable import SiliconPulseCore

final class ThermalAggregationTests: XCTestCase {
    func test_aggregationUsesMaximumReadingPerCpuAndGpuDomain() {
        // Given thermal sensors from multiple CPU and GPU domains.
        let readings = [
            ThermalSensorReading(name: "CPU P-Core 0", celsius: 70),
            ThermalSensorReading(name: "CPU P-Core 1", celsius: 75),
            ThermalSensorReading(name: "GPU 0 die", celsius: 60),
            ThermalSensorReading(name: "GPU 1 die", celsius: 64),
        ]

        // When readings are aggregated into a snapshot-friendly summary.
        let summary = ThermalSensorAggregator.aggregate(readings)

        // Then the highest reading per domain is surfaced.
        XCTAssertEqual(summary.cpuTemperatureCelsius, 75)
        XCTAssertEqual(summary.gpuTemperatureCelsius, 64)
    }

    func test_aggregationAllowsMissingGpuDomainWithoutInventingAZeroReading() {
        // Given CPU readings but no recognized GPU sensor.
        let readings = [
            ThermalSensorReading(name: "CPU die average", celsius: 62),
            ThermalSensorReading(name: "unknown ambient", celsius: 39),
        ]

        // When readings are aggregated.
        let summary = ThermalSensorAggregator.aggregate(readings)

        // Then missing domains remain nil so the UI can show no data.
        XCTAssertEqual(summary.cpuTemperatureCelsius, 62)
        XCTAssertNil(summary.gpuTemperatureCelsius)
    }

    func test_classifierRoutesKnownSensorNamesAndExcludesUnknownNames() {
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "CPU P-Core 2"), .cpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "ECPU cluster temp"), .cpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "GPU die 1"), .gpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "AGX GPU temperature"), .gpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "Tg04"), .gpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "Tf16"), .cpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "Te05"), .cpu)
        XCTAssertEqual(ThermalSensorClassifier.domain(for: "battery ambient"), .other)
    }
}
