const logger = require.main.require('./common/logger.js'),
    electron = require('electron'),
    { app, BrowserWindow, globalShortcut, ipcMain } = require('electron'),
    { fork, spawn } = require('child_process'),
    fs = require('fs'),
    db = require.main.require('./common/db.js'),
    lkt = require.main.require('./common/lkt.js');
var tail = require('tail').Tail;
var client; /* Sub process for the express server */
var lektor; /* Sub process, the lektord player */
var lektor_closed = false; /* Is lektord closed? */

var myDb = new db('/home/kara/kara.db');

/**********************
 * Reinit the logfile *
 **********************/

fs.truncate(logger.logfile, 0, () => {});
var tail = new tail(logger.logfile);
tail.on('line', function (data) {
    console.log(data);
});

/***************************************************************
 * Creates the main window and process for the admin interface *
 ***************************************************************/

function createInstanceWindow() {
    /* Main window */
    const win = new BrowserWindow({
        width: 1280,
        height: 720,
        frame: false,
        menuBarVisible: true,
        webPreferences: {
            nodeIntegration: true,
        },
    });
    win.loadFile('instance/index.html');
}

/******************************
 * The end of the application *
 ******************************/

ipcMain.on('close-app', (evt, arg) => {
    app.quit();
});

app.on('quit', () => {
    logger.info(
        'main',
        'Send SIGTERM to express process, lektord and tailler process'
    );
    client.kill('SIGTERM');
    if (!lektor_closed) {
        lektor.kill('SIGTERM');
    }
});

/*********************************
 * The beggin of the application *
 *********************************/

app.on('ready', () => {
    logger.info('main', 'Main window is ready');
    createInstanceWindow();
    client = fork('client/main.js');
    lektor = spawn('lektord', ['-F']);

    globalShortcut.register('CommandOrControl+D', () => {
        var win = BrowserWindow.getFocusedWindow();
        if (win === null) {
            return;
        }
        logger.info('main', 'Reloading DB');
        let contents = win.webContents;
        myDb.all().then(karas => {
            contents.send('reload-db-responce', karas);
        });
    });
    globalShortcut.register('CommandOrControl+C', () => {});
    globalShortcut.register('F12', () => {
        var focused = BrowserWindow.getFocusedWindow();
        if (focused) {
            focused.webContents.openDevTools();
        }
    });

    lektor.stderr.on('data', data => {
        data.toString()
            .split(/\r?\n/)
            .forEach(line => {
                var line = line.trim();
                if (!line) return;
                switch (line[0]) {
                    case '*':
                        logger.warn(
                            'lektord',
                            line.replace(/^\* (.*)$/g, '$1')
                        );
                        break;
                    case '!':
                        logger.error(
                            'lektord',
                            line.replace(/^! (.*)$/g, '$1')
                        );
                        break;
                    case '.':
                        if (line.length >= 2 && line[1] != '.') {
                            logger.info(
                                'lektord',
                                line.replace(/^\. (.*)$/g, '$1')
                            );
                            break;
                        }
                    /* Fallthrough case */
                    default:
                        logger.debug(
                            'lektord',
                            line.replace(/^\.\.\. (.*)$/g, '\t$1')
                        );
                        break;
                }
            });
    });
    lektor.on('close', code => {
        logger.warn('main', `Lektor exited with code ${code}`);
        lektor_closed = true;
        app.quit();
    });
});

/*********************************
 * Messages from the main window *
 *********************************/

ipcMain.on('cmd-play', (event, arg) => {
    lkt.commandPlay().then(arg => {
        logger.debug('main', 'Returned from cmd-play');
    });
});
ipcMain.on('cmd-stop', (event, arg) => {
    lkt.commandStop().then(arg => {
        logger.debug('main', 'Returned from cmd-stop');
    });
});
ipcMain.on('cmd-clear', (event, arg) => {
    lkt.commandClear().then(arg => {
        logger.debug('main', 'Cleared queue with cmd-clear');
    });
});

/* Fill the pannel with the content of the DB.
 * The `arg` is the HTML object of the pannel */
ipcMain.on('reload-db-request', (event, arg) => {
    logger.info('main', 'Reloading the DB content');
    var callback = karas => {
        event.reply('reload-db-responce', karas);
    };
    if (arg) {
        logger.debug('main', `Reload DB with search '${arg}'`);
        myDb.search(arg, 0, 15).then(callback);
    } else {
        myDb.all(0, 15).then(callback);
    }
});

/* Send the queue to the webpage when asked to */
ipcMain.on('reload-queue-request', (event, arg) => {
    logger.info('main', 'Reloading next karas in queue');
    myDb.queue(0, 100).then(karas => {
        event.reply('reload-queue-responce', karas);
    });
});