const PRODUCTION = process.mainModule.filename.includes("resources")
const path = PRODUCTION ? "resources/app" : "."

const remoteMain = require("@electron/remote/main")
remoteMain.initialize()

const fs = require("fs")
const {shell, app, BrowserWindow, ipcMain, Menu} = require("electron")
const {spawn} = require("child_process")

let pythonProcess

if (PRODUCTION) {
    // pythonProcess = spawn(`${path}/cpython/server.exe`, {stdio: "ignore"})
} else {
    pythonProcess = spawn("python", [`${path}/server.py`], {stdio: "ignore"})
}

let mainWindow
let discordClient
let discordClientStart = Date.now()

const createWindow = () => {
    mainWindow = new BrowserWindow({
        width: 1200,
        height: 1000,
        minHeight: 800,
        minWidth: 1300,
        frame: false,
        webPreferences: {
            nodeIntegration: true,
            enableRemoteModule: true,
            contextIsolation: false
        },
        icon: `${__dirname}/assets/x-icon.png`,
        // show: false,
    })
    remoteMain.enable(mainWindow.webContents)

    app.on('browser-window-created', (_, window) => {
        require("@electron/remote/main").enable(mainWindow.webContents)
    })

    mainWindow.loadFile("index.html")
    mainWindow.shell = shell

    mainWindow.on("ready-to-show", () => {
        mainWindow.show()
    })

    mainWindow.on("closed", () => mainWindow = null)
}

ipcMain.on("resize", (event, arg) => {
    mainWindow.setSize(arg.width, arg.height)
})
ipcMain.on("updatePosition", (event, arg) => {
    const bounds = mainWindow.getBounds()
    bounds.x = parseInt(arg.details[0])
    bounds.y = parseInt(arg.details[1])
    mainWindow.setBounds(bounds)
})
ipcMain.on("updateDiscord", (event, arg) => {

    // Disconnect if turned off
    if (!Object.keys(arg).includes("details")) {
        if (discordClient) {
            try {
                discordClient.disconnect()
            } catch (e) {}
        }
        discordClient = undefined
        return
    }

    if (!discordClient) {
        discordClient = require('discord-rich-presence')('885096702648938546')
    }

    discordClient.updatePresence({
        state: 'Generating AI voice acting',
        details: arg.details,
        startTimestamp: discordClientStart,
        largeImageKey: 'xvasynth_512_512',
        largeImageText: "xVASynth",
        smallImageKey: 'xvasynth_512_512',
        smallImageText: "xVASynth",
        instance: true,
    })
})
ipcMain.on("show-context-menu-editor", (event) => {
    const template = [
        {
            label: 'Copy ARPAbet [v3]',
            click: () => { event.sender.send('context-menu-command', 'context-copy-editor') }
        },
    ]
    const menu = Menu.buildFromTemplate(template)
    menu.popup(BrowserWindow.fromWebContents(event.sender))
})

ipcMain.on("show-context-menu", (event) => {
    const template = [
        {
            label: 'Copy',
            click: () => { event.sender.send('context-menu-command', 'context-copy') }
        },
        {
            label: 'Paste',
            click: () => { event.sender.send('context-menu-command', 'context-paste') }
        },
        // { type: 'separator' },
    ]
    const menu = Menu.buildFromTemplate(template)
    menu.popup(BrowserWindow.fromWebContents(event.sender))
})

// 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", createWindow)


// Quit when all windows are closed.
app.on("window-all-closed", () => {
    // On OS X 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 OS X 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 (mainWindow === null) {
        createWindow()
    }
})