const path = require('path');
const exec = require('child_process').exec;
const fs = require('fs');
const argv = require('yargs-parser')(process.argv.slice(2));
const inquirer = require('inquirer');
const chalk = require('chalk');
const { cleanComment } = require('./cleanComment');

const grammarsPath = path.resolve(__dirname, '../src/grammar');
const outputPath = path.resolve(__dirname, '../src/lib');

const languageEntries = fs.readdirSync(grammarsPath);

const baseCmd = 'antlr4ts -visitor -listener -Xexact-output-dir -o';

function compile(language) {
    const cmd = `${baseCmd} ${outputPath}/${language} ${grammarsPath}/${language}/*.g4`;

    if (language !== 'plsql' && fs.existsSync(`${outputPath}/${language}`)) {
        console.info(chalk.green(`\nRemoving:`, chalk.gray(`${outputPath}/${language}/*`)));
        fs.rmSync(`${outputPath}/${language}`, { recursive: true });
    }

    console.info(chalk.green('Executing:'), chalk.gray(cmd));
    exec(cmd, (err) => {
        if (err) {
            console.error(
                chalk.redBright(`\n[Antlr4 compile error]:`),
                chalk.cyan(language),
                chalk.gray(err)
            );
        } else {
            cleanComment(language);
            console.log(chalk.greenBright(`Compile ${language} succeeded!`));
        }
    });
}

function prompt() {
    inquirer
        .prompt([
            {
                type: 'list',
                name: 'language',
                message: 'Which language you want compile (or all languages)',
                choices: ['All Languages', ...languageEntries],
                loop: true,
            },
        ])
        .then((result) => {
            const language = result.language;
            if (language === 'All Languages') {
                languageEntries.forEach((language) => {
                    compile(language);
                });
            } else {
                compile(result.language);
            }
        });
}

function main() {
    if (argv.all) {
        // compile all: yarn antlr4 --all
        languageEntries.forEach((language) => {
            compile(language);
        });
    } else if (argv.lang) {
        // compile single: yarn antlr4 --lang=mysql
        const supportedLanguage = languageEntries.some((language) => language === argv.lang);
        if (supportedLanguage) {
            compile(argv.lang);
        } else {
            console.error(
                chalk.bold.red('\n[Invalid language]:'),
                chalk.white.underline(`${argv.lang}\n`)
            );
            prompt();
        }
    } else {
        prompt();
    }
}

main();
