Source: Dialogues/index.js

/* Requires */
const fs = require('fs');
const Indexer = require('../index');

/**
 * Função que seleciona o idioma e o diálogo a ser retornado.
 *
 * PARA RETRO-COMPATIBILIDADE APENAS, USE A FUNÇÃO DE SQL PARA NOVOS COMANDOS E FUNÇÕES!!!
 * @param {string} [regionPicker='pt'] - Idioma a ser selecionado.
 * @param {string} [folderPicker='Default'] - Pasta de diálogos.
 * @param {string} [dialogPicker='Default'] - Nome do diálogo a ser selecionado.
 * @param {boolean} [randomize=true] - Se os diálogos devem ser aleatorizados.
 * @param {boolean} [extractOnlyOne=true] - Se deve retornar apenas um diálogo.
 * @param {Object} [objectReplacer={}] - Substituições de chaves nos diálogos.
 * @returns {Array|string} - Um ou todos os diálogos do idioma selecionado.
 */
function dialoguePicker(
    regionPicker = 'pt',
    folderPicker = 'Default',
    dialogPicker = 'Default',
    randomize = true,
    extractOnlyOne = true,
    objectReplacer = {},
) {
    /* Try-Catch para casos de erro */
    try {
        /* Define se é pra retornar todos os idiomas */
        if (regionPicker === 'G.A.L') {
            /* Define o dialogo raiz */
            const tempLanguages = JSON.parse(fs.readFileSync(`${__dirname}/Default/index.json`));

            /* Retorna todos os idiomas */
            return Object.keys(tempLanguages);
        }

        /* Define o idioma, mas antes verifica se é string */
        let userLang = (typeof regionPicker === 'string' ? regionPicker.toLowerCase() : 'pt');

        /* Redefine a object */
        const objRepl = objectReplacer;

        /* Redefine a type */
        const dnamer = dialogPicker;

        /* Redefine o arquivo */
        const dtype = folderPicker;

        /* Determina os diálogos da pasta */
        const dialFolder = fs.readdirSync(__dirname);

        /* Define o arquivo, mas antes verifica se é string */
        let dialType = (typeof dtype === 'string'

            /* Ajusta a primeira letra */
            ? Indexer('string').upperland(dtype.toLowerCase(), false).value

            /* Senão, padrão */
            : 'Default'
        );

        /* Define o diálogo final */
        let dialName = (typeof dnamer === 'string'

            /* Ajusta a primeira letra */
            ? Indexer('string').upperland(dnamer.toLowerCase(), false).value

            /* Senão, padrão */
            : 'Default'
        );

        /* Define o arquivo de idiomas */
        if (!dialFolder.includes(dialType)) {
            /* Ajusta um padrão */
            dialType = 'Default';

            /* Verifica se a pasta direta existe */
            if (dialFolder.includes(dtype)) {
                /* Ajusta o nome original */
                dialType = dtype;
            }
        }

        /* Define temporariamente os diálogos padrões */
        let allDial = JSON.parse(fs.readFileSync(`${__dirname}/${dialType}/index.json`));

        /* Define os idiomas */
        let allKeys = Object.keys(allDial);

        /* Define se deve ajustar os diálogos de novo */
        if (!allKeys.includes(userLang)) {
            /* Define o padrão */
            userLang = 'pt';
        }

        /* Reajusta os diálogos padrões */
        allDial = allDial[userLang];

        /* Define as keys */
        allKeys = Object.keys(allDial);

        /* Define se deve ajustar os diálogos de novo */
        if (!allKeys.includes(dialName)) {
            /* Verifica se a key direta existe */
            if (allKeys.includes(dnamer)) {
                /* Ajusta o nome original */
                dialName = dnamer;

                /* Se não */
            } else {
                /* Define o padrão */
                allDial = (JSON.parse(fs.readFileSync(`${__dirname}/Default/index.json`)));

                /* Reajusta com o idioma padrão novamente */
                allDial = allDial[userLang];

                /* Define o dialogo padrão */
                dialName = 'Default';
            }
        }

        /* Ajusta os diálogos padrões finais */
        allDial = allDial[dialName];

        /* Define se deve aleatorizar */
        if (randomize === true) {
            /* Define eles aleatoriamente */
            allDial = Indexer('array').sort(allDial).value;
        }

        /* Define se deve retornar somente um */
        if (extractOnlyOne === true) {
            /* Retorna o primeiro, use aleatorização para dinamismo */
            return allDial[0].replace(/\{([^}]*)\}/gi, (match, key) => Indexer('others').repl(objRepl, match, key));
        }

        /* Se não retorna apenas um, retorna todos */
        return allDial;

        /* Caso der erro */
    } catch (error) {
        /* Avisa que deu erro e usa a PTBR que é estável */
        console.log('Algum erro ocorreu nos idiomas →', error);

        /* Retorna o padrão */
        return JSON.parse(fs.readFileSync(`${__dirname}/Default/index.json`)).pt.Default;
    }
}

/* Exporta o módulo */
module.exports = dialoguePicker;