import XCTest
@testable import LocalSkyRadar

final class AdaptiveRangeTests: XCTestCase {
    func testAdaptiveRangeDefaultsToTwentyFiveWhenTrafficIsSparse() {
        let service = RadarDataService()

        XCTAssertEqual(service.adaptiveRange(aircraft: []), 25)
        XCTAssertEqual(service.adaptiveRange(aircraft: aircraft(at: [3, 9, 19, 24, 31])), 25)
    }

    func testAdaptiveRangeZoomsToSixthNearestAircraftRoundedUpToFiveNm() {
        let service = RadarDataService()

        XCTAssertEqual(service.adaptiveRange(aircraft: aircraft(at: [1, 2, 4, 7, 11, 12.1, 13, 20])), 15)
        XCTAssertEqual(service.adaptiveRange(aircraft: aircraft(at: [0.5, 1, 1.8, 2.4, 3, 4.2, 8, 22])), 5)
    }

    func testAdaptiveRangeNeverExceedsTwentyFiveNm() {
        let service = RadarDataService()

        XCTAssertEqual(service.adaptiveRange(aircraft: aircraft(at: [2, 4, 8, 11, 20, 30, 45])), 25)
    }

    func testAdaptiveScopeCapsVisibleAircraftToSixNearest() {
        let service = RadarDataService()
        let scoped = service.adaptiveScope(aircraft: aircraft(at: [1, 2, 3, 4, 5, 6, 6.2, 7, 8, 9, 10]))

        XCTAssertEqual(scoped.rangeNM, 10)
        XCTAssertEqual(scoped.aircraft.map(\.distNM), [1, 2, 3, 4, 5, 6])
    }

    private func aircraft(at distances: [Double]) -> [Aircraft] {
        distances.enumerated().map { index, dist in
            Aircraft(
                id: "\(index)",
                callsign: "A\(index)",
                type: "T\(index)",
                registration: "R\(index)",
                lat: 0,
                lon: 0,
                altitudeFt: 10_000,
                groundSpeedKt: 400,
                trackDeg: 0,
                trend: .level,
                source: .adsb,
                distNM: dist,
                bearingDeg: 0
            )
        }
    }
}
