import Cocoa

class InputDialog: NSObject {
    func run(prompt: String) -> String? {
        let alert = NSAlert()
        alert.messageText = prompt
        alert.addButton(withTitle: "OK")
        alert.addButton(withTitle: "Cancel")

        let stack = NSStackView(frame: NSRect(x: 0, y: 0, width: 300, height: 50))
        stack.orientation = .vertical
        stack.spacing = 8

        let secureField = NSSecureTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24))
        secureField.placeholderString = "Enter passphrase"
        let plainField = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24))
        plainField.placeholderString = "Enter passphrase"
        plainField.isHidden = true

        let toggle = NSButton(checkboxWithTitle: "Show passphrase", target: nil, action: nil)

        class ToggleHandler: NSObject {
            let secureField: NSSecureTextField
            let plainField: NSTextField
            let toggle: NSButton
            init(s: NSSecureTextField, p: NSTextField, t: NSButton) {
                secureField = s; plainField = p; toggle = t
            }
            @objc func toggled(_ sender: Any?) {
                if toggle.state == .on {
                    plainField.stringValue = secureField.stringValue
                    secureField.isHidden = true
                    plainField.isHidden = false
                    plainField.becomeFirstResponder()
                } else {
                    secureField.stringValue = plainField.stringValue
                    plainField.isHidden = true
                    secureField.isHidden = false
                    secureField.becomeFirstResponder()
                }
            }
        }
        let handler = ToggleHandler(s: secureField, p: plainField, t: toggle)
        toggle.target = handler
        toggle.action = #selector(ToggleHandler.toggled(_:))

        stack.addArrangedSubview(secureField)
        stack.addArrangedSubview(plainField)
        stack.addArrangedSubview(toggle)

        alert.accessoryView = stack
        alert.window.initialFirstResponder = secureField

        let response = alert.runModal()
        if response == .alertFirstButtonReturn {
            return toggle.state == .on ? plainField.stringValue : secureField.stringValue
        }
        return nil
    }
}

let app = NSApplication.shared
app.setActivationPolicy(.accessory)

let dialog = InputDialog()
let prompt = CommandLine.arguments.count > 1 ? CommandLine.arguments[1] : "Enter passphrase"
if let value = dialog.run(prompt: prompt) {
    print(value)
} else {
    fputs("CANCELLED\n", stderr)
    exit(1)
}
