import AppKit

final class InputSheet: NSViewController {

    var onComplete: ((String?) -> Void)?

    private let sheetTitle: String
    private let prompt: String
    private let defaultValue: String
    private let inputField = NSTextField()

    init(title: String, prompt: String, defaultValue: String = "") {
        self.sheetTitle = title
        self.prompt = prompt
        self.defaultValue = defaultValue
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) { fatalError() }

    override func loadView() {
        view = NSView(frame: NSRect(x: 0, y: 0, width: 320, height: 120))
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        buildUI()
    }

    private func buildUI() {
        let titleLabel = NSTextField(labelWithString: sheetTitle)
        titleLabel.font = .boldSystemFont(ofSize: 13)

        let promptLabel = NSTextField(labelWithString: prompt)
        promptLabel.setAccessibilityLabel(prompt)

        inputField.stringValue = defaultValue
        inputField.setAccessibilityLabel(prompt)
        inputField.target = self; inputField.action = #selector(okClicked)

        let cancelButton = NSButton(title: "Cancel", target: self, action: #selector(cancelClicked))
        cancelButton.bezelStyle = .rounded

        let okButton = NSButton(title: "OK", target: self, action: #selector(okClicked))
        okButton.bezelStyle = .rounded; okButton.keyEquivalent = "\r"

        let buttonRow = NSStackView(views: [NSView(), cancelButton, okButton])
        buttonRow.orientation = .horizontal; buttonRow.spacing = 8

        let stack = NSStackView(views: [titleLabel, promptLabel, inputField, buttonRow])
        stack.orientation = .vertical; stack.spacing = 8
        stack.edgeInsets = NSEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)
        stack.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stack)
        NSLayoutConstraint.activate([
            stack.topAnchor.constraint(equalTo: view.topAnchor),
            stack.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            stack.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            stack.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])
    }

    override func viewDidAppear() {
        super.viewDidAppear()
        inputField.becomeFirstResponder()
        inputField.selectText(nil)
    }

    @objc private func okClicked() {
        let value = inputField.stringValue
        dismiss(nil)
        onComplete?(value)
    }

    @objc private func cancelClicked() {
        dismiss(nil)
        onComplete?(nil)
    }
}
