import AppKit
import SwiftUI

@MainActor
enum WidgetVisualRenderer {
    static func main() throws {
        let outputPath = CommandLine.arguments.dropFirst().first ?? "/tmp/localsky_extra_large_widget.png"
        let outputURL = URL(fileURLWithPath: outputPath)
        try FileManager.default.createDirectory(
            at: outputURL.deletingLastPathComponent(),
            withIntermediateDirectories: true
        )

        let entry = RadarEntry(
            date: Date(timeIntervalSince1970: 1_789_000_000),
            center: Airport(icao: "KSFO", name: "San Francisco International", lat: 37.619, lon: -122.375),
            aircraft: [
                aircraft(id: "a1", callsign: "UAL123", type: "B739", registration: "N123UA", distNM: 5, bearingDeg: 305, altitudeFt: 30_000, groundSpeedKt: 450, trackDeg: 90),
                aircraft(id: "a2", callsign: "N172SP", type: "C172", registration: "N172SP", distNM: 7, bearingDeg: 250, altitudeFt: 4_200, groundSpeedKt: 112, trackDeg: 135),
                aircraft(id: "a3", callsign: "LXJ45", type: "GLF5", registration: "N45LJ", distNM: 9, bearingDeg: 48, altitudeFt: 18_000, groundSpeedKt: 410, trackDeg: 270),
                aircraft(id: "a4", callsign: "R44TV", type: "R44", registration: "N44TV", distNM: 12, bearingDeg: 140, altitudeFt: 900, groundSpeedKt: 92, trackDeg: 45),
                aircraft(id: "a5", callsign: "ASA789", type: "A320", registration: "N789AS", distNM: 15, bearingDeg: 120, altitudeFt: 24_000, groundSpeedKt: 430, trackDeg: 180),
                aircraft(id: "a6", callsign: "TEST6", type: "PA28", registration: "N28PA", distNM: 18, bearingDeg: 18, altitudeFt: 3_500, groundSpeedKt: 105, trackDeg: 210)
            ],
            rangeNM: 25,
            rangeMode: .adaptive,
            selectedAircraftId: "a2",
            locationMode: .currentLocation,
            theme: .muted,
            scopeShape: .circle
        )

        let view = ExtraLargeWidgetView(entry: entry)
            .frame(width: 720, height: 382)

        let renderer = ImageRenderer(content: view)
        renderer.scale = 1

        guard let cgImage = renderer.cgImage else {
            throw RenderError.noImage
        }

        let bitmap = NSBitmapImageRep(cgImage: cgImage)
        guard let png = bitmap.representation(using: .png, properties: [:]) else {
            throw RenderError.noPNG
        }

        try png.write(to: outputURL)
        print(outputURL.path)
    }

    private static func aircraft(
        id: String,
        callsign: String,
        type: String,
        registration: String,
        distNM: Double,
        bearingDeg: Double,
        altitudeFt: Int,
        groundSpeedKt: Int,
        trackDeg: Double
    ) -> Aircraft {
        Aircraft(
            id: id,
            callsign: callsign,
            type: type,
            registration: registration,
            lat: 37.619 + (distNM / 60.0),
            lon: -122.375,
            altitudeFt: altitudeFt,
            groundSpeedKt: groundSpeedKt,
            trackDeg: trackDeg,
            trend: .level,
            source: .adsb,
            distNM: distNM,
            bearingDeg: bearingDeg
        )
    }
}

enum RenderError: Error {
    case noImage
    case noPNG
}

@main
enum RenderMain {
    static func main() throws {
        try WidgetVisualRenderer.main()
    }
}
