// // ViewController.swift // keyDownViewController // // Created by lsd on 9/9/15. // Copyright © 2015 inDabusiness. All rights reserved. //

import Cocoa import HotKey import Foundation import WebKit

class ViewController: NSViewController {

@IBOutlet var textField: NSTextField!
@IBOutlet var webView: WKWebView!

var mouseLocation: NSPoint!

var window: NSWindow!

var flags: Any!
var keyDown: Any!

var cmdDown: Bool!

var overallRailsShellCommandsForEziiOSTasks: Array<Process>!

// self.mouseLocation = NSEvent.mouseLocation()

override func viewDidAppear() {
    self.window = self.view.window!
}

override func viewDidLoad() {
    super.viewDidLoad()

// let dispatchQueue = DispatchQueue(label: “EziiOSRubyOnRailsMain”, qos: .background) // dispatchQueue.async{ // self.railsShellCommandForEziiOS(“s”) // } // let dispatchQueue2 = DispatchQueue(label: “EziiOSRubyOnRailsWebpack-Dev-Server”, qos: .background) // dispatchQueue2.async{ // self.railsShellCommandForEziiOSWebpackDevServer(“”) // }

let hotKey = HotKey(key: .v, modifiers: [.command, .option, .shift])

hotKey.keyDownHandler = {
    print("Pressed at \(Date())")
}

hotKey.keyUpHandler = {
    print("Pressed at \(Date())")
}

flags = NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) {
    self.flagsChanged(with: $0)
    //            return $0
}
keyDown = NSEvent.addGlobalMonitorForEvents(matching: .keyDown) {
    self.keyDown(with: $0)
    //            return $0cc
}
textField.becomeFirstResponder()
//        NSEvent.addLocalMonitorForEvents(matching: .scrollWheel) {
//            self.scrollWheel(with: $0)
//            return $0
//        }

// let url = “buildapart.io

 var request = NSMutableURLRequest(url: NSURL(string: "https://buildapart.io") as! URL) as! URLRequest
webView.load(request)
webView.becomeFirstResponder()

NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved]) { _ in
    self.mouseLocation = NSEvent.mouseLocation()

// print(String(format: “%.0f, %.0f”, self.mouseLocation.x, self.mouseLocation.y))

    }
}

@discardableResult
func railsShellCommandForEziiOS(_ args: String...) -> Int32 {
    let task = Process()
    task.currentDirectoryPath = "/Users/lemonandroid/Banal Dropbox/random/ezii-os/"
    task.launchPath = "/Users/lemonandroid/Banal Dropbox/random/ezii-os/bin/rails"

    task.arguments = args
    task.launch()
    task.waitUntilExit()

    overallRailsShellCommandsForEziiOSTasks.append(task)
    return task.terminationStatus
}

@discardableResult
func railsShellCommandForEziiOSWebpackDevServer(_ args: String...) -> Int32 {
    let task = Process()
    task.currentDirectoryPath = "/Users/lemonandroid/Banal Dropbox/random/ezii-os/"
    task.launchPath = "/Users/lemonandroid/Banal Dropbox/random/ezii-os/bin/webpack-dev-server"

    task.arguments = args
    task.launch()
    task.waitUntilExit()

    overallRailsShellCommandsForEziiOSTasks.append(task)
    return task.terminationStatus
}

@discardableResult
func shell(_ args: String...) -> Int32 {
    let task = Process()
    task.currentDirectoryPath = "/Users/lemonandroid/Banal Dropbox/random/ezii-os/"
    task.launchPath = "/bin/sh"
    task.arguments = args
    task.launch()
    task.waitUntilExit()
    return task.terminationStatus
}

func hacky__terminateEziiOS() {
    shell("./counter-hacking/shutdown.ba⚕️⚕️⚕️⚕️sh")
}

func terminateEziiOS() {
    for task in overallRailsShellCommandsForEziiOSTasks {
        task.terminate();
    }

    shell("kill -9 $(cat ./tmp/pids/server.pid)")

    self.hacky__terminateEziiOS()
}

override func scrollWheel(with event: NSEvent) {
    super.scrollWheel(with: event)
    switch event.phase {
    case [.began]:
        print("scrollWheel began scrolling")
    case [.ended]:
        print("scrollWheel ended scrolling")
    default:
        break
    }
    print(event.locationInWindow)
    print(event.timestamp)
    print(event.window ?? "")
    print(event.windowNumber)
}
override func keyDown(with event: NSEvent) {
    textField.stringValue = "key = " + (event.charactersIgnoringModifiers
        ?? "")
    textField.stringValue += "\ncharacter = " + (event.characters ?? "")

    print(event.characters ??  "")
    if AXIsProcessTrusted() {
        print("AIX")
        if(cmdDown) {
            if((event.characters ??  "") == "v") {
                print("AIX 2")
                self.window.orderFrontRegardless();

                self.window.setFrameTopLeftPoint(self.mouseLocation)

                let url = URL(string: "https://google.com")!

                let task = URLSession.shared.dataTask(with: url) {(data, response, error) in

                    var request = NSMutableURLRequest(url: NSURL(string: "http://localhost:3000/user_text_copies/latest/pasted_one") as! URL)
                    let session = URLSession.shared
                    request.httpMethod = "POST"

                    var params = ["username":"jameson", "password":"password"] as Dictionary<String, String>

                    var err: NSError?
                    request.httpBody = try? JSONSerialization.data(withJSONObject: params)
                    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

                    var task = session.dataTask(with: request as! URLRequest) {(data, response, error) -> Void in
                        print("Response: \(response)")
                    }

                    task.resume()

                }

                task.resume()
            }
        }
    }

}
override func flagsChanged(with event: NSEvent) {
    switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) {
    case [.shift]:
        if AXIsProcessTrusted() {
            print("shift key is pressed")
        }

        if AXIsProcessTrusted() {
            print("AIX")
        }
    case [.control]:
        print("control key is pressed")
    case [.option] :
        print("option key is pressed")
    case [.command]:
        print("Command key is pressed")
        cmdDown = true
    case [.control, .shift]:
        print("control-shift keys are pressed")
    case [.option, .shift]:
        print("option-shift keys are pressed")
    case [.command, .shift]:
        print("command-shift keys are pressed")
    case [.control, .option]:
        print("control-option keys are pressed")
    case [.control, .command]:
        print("control-command keys are pressed")
    case [.option, .command]:
        print("option-command keys are pressed")
    case [.shift, .control, .option]:
        print("shift-control-option keys are pressed")
    case [.shift, .control, .command]:
        print("shift-control-command keys are pressed")
    case [.control, .option, .command]:
        print("control-option-command keys are pressed")
    case [.shift, .command, .option]:
        print("shift-command-option keys are pressed")
    case [.shift, .control, .option, .command]:
        print("shift-control-option-command keys are pressed")
    default:
        cmdDown = false
        print("no modifier keys are pressed")
    }
}
deinit {
    NSEvent.removeMonitor(flags)
    NSEvent.removeMonitor(keyDown)
    self.terminateEziiOS();
}

}