import { app, BrowserWindow, ipcMain } from "electron";
import fs from 'fs/promises'
import { WORKING_DIR } from "../constants";
import path from "path";
import { Logger } from "../logger";

const logger = Logger('bootloader');


ipcMain.handleOnce('report-boot-process-failed', async () => {
    /**
     * Если процесс загрузки не завершился успешно, то preload показывает
     * экран ошибки, а нам нужно откатиться назад к загрузке dev.html
     * и удалить скомпилированные файлы, чтобы при следующем запуске
     * приложение попыталось загрузиться в режиме разработки.
     */
    let filePath = path.join(WORKING_DIR, 'b');
    if(!await existsFile(filePath)){
        /**
         * Исправление ошибки когда директории нет.
         */
        logger.log("No compiled files to remove");
        return;
    }
    await fs.rmdir(filePath, { recursive: true });
    logger.log("Boot process failed, removed compiled files");
    logger.log(`Removed compiled files at ${filePath}`);
    logger.log(`Restarting application in safe mode`);
    app.relaunch();
    app.exit(0);
});

/**
 * Boot функция, эта функция запускает приложение
 * @param window окно
 */
export async function boot(window : BrowserWindow) {
    if (!app.isPackaged && process.env['ELECTRON_RENDERER_URL']) {
        await bootDevelopment(window);
       // await bootProduction(window);
        window.webContents.openDevTools({ mode: 'detach' });
        //console.info(window.webContents);
        return;
    }
    //window.webContents.openDevTools({ mode: 'detach' });
    await bootProduction(window);
}

async function bootProduction(window : BrowserWindow) {
    logger.log("Booting in production mode");
    let html = path.join(WORKING_DIR, 'b', 'j.html');
    if(await existsFile(html)){
        logger.log(`Loading compiled file`);
        window.loadFile(html);
    } else {
        logger.log(`Loading conatiner file`);
        window.loadFile(path.join(__dirname, '../renderer/dev.html'));
    }
}

async function bootDevelopment(window : BrowserWindow) {
    logger.log("Booting in development mode");
	window.loadURL(process.env['ELECTRON_RENDERER_URL'] + "/dev.html");
	window.webContents.openDevTools({ mode: 'detach' });
}

async function existsFile(filePath: string): Promise<boolean> {
    try {
        await fs.access(filePath);
        return true;
    } catch {
        return false;
    }
}
