#!/usr/bin/env node

const ver = process.version.match(/v(\d+)\.\d+\.\d+/);

if (parseInt(ver[1], 10) < 12) {
    console.error(
        `node.js ${process.version} is not supported. ` +
        'CyTube requires node v12 or later.'
    )
    process.exit(1);
}

checkPlayerExists();

const args = parseArgs();

if (args.has('--daemonize')) {
    fork();
} else {
    try {
        require('./lib/main');
    } catch (err) {
        console.error('FATAL: Failed to require() lib/main.js');
        handleStartupError(err);
    }
}

function fork() {
    try {
        console.log('Warning: --daemonize support is experimental.  Use with caution.');

        const spawn = require('child_process').spawn;
        const path = require('path');
        const main = path.resolve(__dirname, 'lib', 'main.js');

        const child = spawn(process.argv[0], [main], {
            detached: true,
            stdio: 'ignore' // TODO: support setting stdout/stderr logfile
        });

        child.unref();
        console.log('Forked with PID ' + child.pid);
    } catch (error) {
        console.error('FATAL: Failed to fork lib/main.js');
        handleStartupError(error);
    }
}

function handleStartupError(err) {
    if (/module version mismatch/i.test(err.message)) {
        console.error('Module version mismatch, try running `npm rebuild` or ' +
                      'removing the node_modules folder and re-running ' +
                      '`npm install`');
    } else {
        console.error('Possible causes:\n' +
                      '  * You haven\'t run `npm run build-server` to regenerate ' +
                      'the runtime\n' +
                      '  * You\'ve upgraded node/npm and haven\'t rebuilt dependencies ' +
                      '(try `npm rebuild` or `rm -rf node_modules && npm install`)\n' +
                      '  * A dependency failed to install correctly (check the output ' +
                      'of `npm install` next time)');
    }

    console.error(err.stack);
    process.exit(1);
}

function parseArgs() {
    const args = new Map();
    for (var i = 2; i < process.argv.length; i++) {
        if (/^--/.test(process.argv[i])) {
            var val;
            if (i+1 < process.argv.length) val = process.argv[i+1];
            else val = null;

            args.set(process.argv[i], val);
        }
    }

    return args;
}

function checkPlayerExists() {
    const fs = require('fs');
    const path = require('path');

    const playerDotJs = path.join(__dirname, 'www', 'js', 'player.js');

    if (!fs.existsSync(playerDotJs)) {
        console.error(
            'Missing video player: www/js/player.js.  This should have been ' +
            'automatically generated by the postinstall step of ' +
            '`npm install`, but you can manually regenerate it by running ' +
            '`npm run build-player`'
        );
        process.exit(1);
    }
}
