import AppKit
import SiliconPulseCore
import SwiftUI

@MainActor
final class StatusItemController: NSObject {
    private let statusBar: NSStatusBar
    private let statusItem: NSStatusItem
    private let popover = NSPopover()
    private var refreshCoordinator: RefreshCoordinator?
    private var latestModel: SystemHealthModel?

    init(statusBar: NSStatusBar = .system) {
        self.statusBar = statusBar
        self.statusItem = statusBar.statusItem(withLength: NSStatusItem.squareLength)
        super.init()
        self.configurePlaceholder()
        self.configurePopover()
        self.refreshCoordinator = RefreshCoordinator { [weak self] snapshot in
            self?.apply(snapshot: snapshot)
        }
        self.refreshCoordinator?.start()
    }

    func invalidate() {
        self.refreshCoordinator?.stop()
        self.statusBar.removeStatusItem(self.statusItem)
    }

    private func configurePlaceholder() {
        guard let button = self.statusItem.button else { return }
        button.image = NSImage(
            systemSymbolName: "gauge.with.dots.needle.67percent",
            accessibilityDescription: "SiliconPulse")
        button.image?.isTemplate = true
        button.imageScaling = .scaleProportionallyDown
        button.toolTip = "SiliconPulse"
        button.setAccessibilityTitle("SiliconPulse")
        button.setAccessibilityIdentifier("SiliconPulse.StatusItem")
        button.target = self
        button.action = #selector(togglePopover(_:))
    }

    private func configurePopover() {
        self.popover.behavior = .transient
        self.popover.animates = true
    }

    private func apply(snapshot: SystemSnapshot) {
        let model = HealthModel.model(for: snapshot)
        self.latestModel = model

        if let image = GaugeImageRenderer.renderMenuBarImage(for: model.menubar),
           let button = self.statusItem.button
        {
            button.image = image
            button.imageScaling = .scaleNone
            button.toolTip = "SiliconPulse: \(Self.label(for: model.menubar.bucket))"
        }

        if self.popover.isShown {
            self.popover.contentViewController = NSHostingController(rootView: DetailPopoverView(model: model))
        }
    }

    @objc
    private func togglePopover(_ sender: Any?) {
        _ = sender
        guard let button = self.statusItem.button else { return }

        if self.popover.isShown {
            self.popover.performClose(nil)
            return
        }

        let model = self.latestModel ?? HealthModel.model(for: SystemSnapshot(
            cpuTemperatureCelsius: nil,
            gpuTemperatureCelsius: nil,
            memoryPressureFraction: 0,
            memoryPressureLevel: .normal,
            thermalState: SystemThermalState(ProcessInfo.processInfo.thermalState)))
        self.popover.contentViewController = NSHostingController(rootView: DetailPopoverView(model: model))
        self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: .minY)
    }

    private static func label(for bucket: HealthColorBucket) -> String {
        switch bucket {
        case .white:
            "Normal"
        case .yellow:
            "High"
        case .red:
            "Extreme"
        }
    }
}
