import AppKit
import Carbon

extension NSEvent.ModifierFlags {
	public var carbonFlags: UInt32 {
		var carbonFlags: UInt32 = 0

		if contains(.command) {
			carbonFlags |= UInt32(cmdKey)
		}

		if contains(.option) {
			carbonFlags |= UInt32(optionKey)
		}

		if contains(.control) {
			carbonFlags |= UInt32(controlKey)
		}

		if contains(.shift) {
			carbonFlags |= UInt32(shiftKey)
		}

		return carbonFlags
	}

	public init(carbonFlags: UInt32) {
		self.init()

		if carbonFlags & UInt32(cmdKey) == UInt32(cmdKey) {
			insert(.command)
		}

		if carbonFlags & UInt32(optionKey) == UInt32(optionKey) {
			insert(.option)
		}

		if carbonFlags & UInt32(controlKey) == UInt32(controlKey) {
			insert(.control)
		}

		if carbonFlags & UInt32(shiftKey) == UInt32(shiftKey) {
			insert(.shift)
		}
	}
}

extension NSEvent.ModifierFlags: @retroactive CustomStringConvertible {
    public var description: String {
        var output = ""

        if contains(.control) {
            output += Key.control.description
        }

        if contains(.option) {
            output += Key.option.description
        }

        if contains(.shift) {
            output += Key.shift.description
        }

        if contains(.command) {
            output += Key.command.description
        }

        return output
    }
}
