"use strict";

import myLogger from "electron-log";
import { app, protocol, BrowserWindow, ipcMain } from "electron";
const path = require("path");
const os = require("os");
import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
const isDevelopment = process.env.NODE_ENV !== "production";
import ModalsManager from "./components/Modals/Modals";

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
    { scheme: "app", privileges: { secure: true, standard: true } }
]);

let win: BrowserWindow;
async function createWindow() {
    // Create the browser window.
    win = new BrowserWindow({
        title: "nodeSnap",
        width: 1280,
        height: 720,
        autoHideMenuBar: true,
        webPreferences: {
            webSecurity: true,
            allowRunningInsecureContent: true,
            enableRemoteModule: true,

            // Use pluginOptions.nodeIntegration, leave this alone
            // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
            nodeIntegration: (process.env
                .ELECTRON_NODE_INTEGRATION as unknown) as boolean
        }
    });

    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // Load the url of the dev server if in development mode
        win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string);

        if (!process.env.IS_TEST) win.webContents.openDevTools();
    } else {
        createProtocol("app");
        // Load the index.html when not in development
        win.loadURL("app://./index.html");
    }

    win.webContents.on("did-finish-load", () => {
        myLogger.log("main window created!");
        win.webContents.send("setId", { id: "Main" });
    });

    win.on("close", () => {
        myLogger.log("Quit requested");
        if (win.webContents.isDevToolsOpened()) {
            win.webContents.closeDevTools();
        }
        ModalsManager.getInstance().dispose();
    });

    win.on("closed", () => {
        app.quit();
    });

    /**
     * Init
     */
    new ModalsManager();
}

// Quit when all windows are closed.
app.on("window-all-closed", () => {
    // On macOS it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== "darwin") {
        app.quit();
    }
});

app.on("activate", () => {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", async () => {
    if (isDevelopment && !process.env.IS_TEST) {
        /**
         * Since this is Vue 3, we need to download the beta extention.
         * You can download it on your browser (chromuim based) and set the path here
         */
        /*await session.defaultSession.loadExtension(
      "C:/Users/Moncef/AppData/Local/BraveSoftware/Brave-Browser/User Data/Default/Extensions/ljjemllljcmogpfapbkkighbhhppjdbg/6.0.0.3_0"
    );*/
    }
    //myLogger.log("creating main window...");
    createWindow();
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
    if (process.platform === "win32") {
        process.on("message", data => {
            if (data === "graceful-exit") {
                app.quit();
            }
        });
    } else {
        process.on("SIGTERM", () => {
            app.quit();
        });
    }
}

process.on("uncaughtException", function(err) {
    myLogger.error(err);
});

/**
 * Renderer -> mainThread communication
 */
ipcMain.on("setModalVisibility", (event, arg) => {
    ModalsManager.getInstance().setModalVisibility(
        arg.name,
        arg.state,
        arg.data
    );
});

ipcMain.on("hideAllModals", (event, arg) => {
    ModalsManager.getInstance().hideAllModals();
});

/**
 * Settings
 */
ipcMain.on("set-settings", (event, arg) => {
    win.webContents.send("set-settings", arg);
});

/**
 * Groups
 */
ipcMain.on("grpEdit", (event, arg) => {
    win.webContents.send("grpEdit", arg);
});

/**
 * Blueprints
 */
ipcMain.on("blueprintEdit", (event, arg) => {
    win.webContents.send("blueprintEdit", arg);
});

ipcMain.on("modelEdit", (event, arg) => {
    win.webContents.send("modelEdit", arg);
});

/**
 * Transformation
 */
ipcMain.on("transform", (event, arg) => {
    win.webContents.send("transform", arg);
});
/**
 * Duplicate visible
 */
ipcMain.on("duplicateVisible", (event, arg) => {
    win.webContents.send("duplicateVisible", arg);
});