import AppKit
import AlignerCore

@MainActor
final class SettingsWindowController: NSWindowController {
    private let modeProvider: () -> QuickSwitchWaterfallViewMode
    private let onWaterfallViewModeChanged: (QuickSwitchWaterfallViewMode) -> Void
    private let tabView = NSTabView()
    private let verticalColumnsButton = NSButton(
        radioButtonWithTitle: "纵栏瀑布",
        target: nil,
        action: nil
    )
    private let horizontalMasonryButton = NSButton(
        radioButtonWithTitle: "横栏瀑布",
        target: nil,
        action: nil
    )

    init(
        modeProvider: @escaping () -> QuickSwitchWaterfallViewMode,
        onWaterfallViewModeChanged: @escaping (QuickSwitchWaterfallViewMode) -> Void
    ) {
        self.modeProvider = modeProvider
        self.onWaterfallViewModeChanged = onWaterfallViewModeChanged

        let window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 520, height: 340),
            styleMask: [.titled, .closable, .miniaturizable],
            backing: .buffered,
            defer: false
        )
        window.title = "Aligner 设置"
        window.isReleasedWhenClosed = false
        window.center()

        super.init(window: window)
        window.contentView = makeContentView()
        refreshWaterfallViewMode()
    }

    @available(*, unavailable)
    required init?(coder: NSCoder) {
        nil
    }

    override func showWindow(_ sender: Any?) {
        refreshWaterfallViewMode()
        tabView.selectTabViewItem(withIdentifier: "view")
        super.showWindow(sender)
        window?.makeKeyAndOrderFront(sender)
    }

    func refreshWaterfallViewMode() {
        let mode = modeProvider()
        verticalColumnsButton.state = mode == .verticalColumns ? .on : .off
        horizontalMasonryButton.state = mode == .horizontalMasonry ? .on : .off
    }

    func reportDictionary() -> [String: Any] {
        [
            "exists": true,
            "visible": window?.isVisible ?? false,
            "title": window?.title ?? "",
            "selectedTabLabel": tabView.selectedTabViewItem?.label ?? "",
            "selectedTabIdentifier": tabView.selectedTabViewItem?.identifier as? String ?? "",
            "waterfallViewMode": modeProvider().rawValue,
            "hasViewTab": tabView.tabViewItems.contains { $0.identifier as? String == "view" },
            "usesSwiftUI": false
        ]
    }

    private func makeContentView() -> NSView {
        tabView.translatesAutoresizingMaskIntoConstraints = false
        tabView.tabViewType = .topTabsBezelBorder
        tabView.addTabViewItem(makeViewTab())

        let root = NSView()
        root.addSubview(tabView)
        NSLayoutConstraint.activate([
            tabView.leadingAnchor.constraint(equalTo: root.leadingAnchor, constant: 20),
            tabView.trailingAnchor.constraint(equalTo: root.trailingAnchor, constant: -20),
            tabView.topAnchor.constraint(equalTo: root.topAnchor, constant: 18),
            tabView.bottomAnchor.constraint(equalTo: root.bottomAnchor, constant: -20)
        ])
        return root
    }

    private func makeViewTab() -> NSTabViewItem {
        let tab = NSTabViewItem(identifier: "view")
        tab.label = "视图"
        tab.view = makeViewSettingsView()
        return tab
    }

    private func makeViewSettingsView() -> NSView {
        let title = NSTextField(labelWithString: "Quick Switch 视图")
        title.font = .systemFont(ofSize: 18, weight: .semibold)

        let subtitle = NSTextField(wrappingLabelWithString: "切换后立即生效。")
        subtitle.textColor = .secondaryLabelColor

        verticalColumnsButton.target = self
        verticalColumnsButton.action = #selector(selectVerticalColumns)
        horizontalMasonryButton.target = self
        horizontalMasonryButton.action = #selector(selectHorizontalMasonry)

        let modeStack = NSStackView(views: [verticalColumnsButton, horizontalMasonryButton])
        modeStack.orientation = .vertical
        modeStack.alignment = .leading
        modeStack.spacing = 10

        let stack = NSStackView(views: [title, subtitle, modeStack])
        stack.orientation = .vertical
        stack.alignment = .leading
        stack.spacing = 14
        stack.translatesAutoresizingMaskIntoConstraints = false

        let view = NSView()
        view.addSubview(stack)
        NSLayoutConstraint.activate([
            stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 22),
            stack.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -22),
            stack.topAnchor.constraint(equalTo: view.topAnchor, constant: 24)
        ])
        return view
    }

    @objc private func selectVerticalColumns() {
        onWaterfallViewModeChanged(.verticalColumns)
        refreshWaterfallViewMode()
    }

    @objc private func selectHorizontalMasonry() {
        onWaterfallViewModeChanged(.horizontalMasonry)
        refreshWaterfallViewMode()
    }
}
