// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause

import Cocoa
import Foundation
import Virtualization

class AppDelegate: NSObject, NSApplicationDelegate  {
    @IBOutlet var window: NSWindow!

    @IBOutlet weak var virtualMachineView: VZVirtualMachineView!

    var runner: VMController!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        DispatchQueue.main.async { [self] in
            runner = VMController()
            runner.createVirtualMachine()
            virtualMachineView.virtualMachine = runner.virtualMachine
            virtualMachineView.capturesSystemKeys = true

            // Configure the app to automatically respond to changes in the display size.
            virtualMachineView.automaticallyReconfiguresDisplay = true

            let fileManager = FileManager.default
            if fileManager.fileExists(atPath: config.saveFileURL.path) {
                print("Restoring virtual machine state from \(config.saveFileURL)")
                runner.restoreVirtualMachine()
            } else {
                print("Restarting virtual machine")
                runner.startVirtualMachine()
            }

        }
    }

    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
        return true
    }

    func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
        if runner.virtualMachine.state == .running {
            runner.pauseAndSaveVirtualMachine(completionHandler: {
                sender.reply(toApplicationShouldTerminate: true)
            })

            return .terminateLater
        }

        return .terminateNow
    }
}