const GOVBRPlataformaLogsLevel = {
    FATAL: 'fatal',
    ERROR: 'error',
    INFO: 'info',
    WARN: 'warn',
    DEBUG: 'debug',
};

/**
 * Classe para controles e geração de logs.
 */
class GOVBRPlataformaLogs {
    static isDevelop = /^https?:\/\/(develop.govbr.com.br|localhost)$/.test(window.location.origin);
    static isHomolog = /^https?:\/\/(homolog.govbr.com.br)$/.test(window.location.origin);

    static init() {
        if (window.top === window) {
            console.log('%c---ATENÇÃO---', 'font-size: 20px; background-color: yellow; color: red; font-weight: bold;');
            console.log(
                '%cEsta é uma ferramenta dedicada para desenvolvedores! O uso indevido desta ferramenta pode resultar em seus dados e informações pessoais sendo roubados ou extraviados.',
                'font-size: 12px'
            );
            console.log(
                '%cSomente a utilize sobre orientação técnica e nunca copie e cole nenhum código ou texto de qualquer fonte neste local!',
                'font-size: 14px;font-weight: bold'
            );
        }

        if (!GOVBRPlataformaLogs.isDevelop && !GOVBRPlataformaLogs.isHomolog) {
            console.log = () => {};
            console.warn = () => {};
            console.debug = () => {};
            console.dir = () => {};
            console.dirxml = () => {};
            console.info = () => {};
        }
    }

    /**
     * @param {string} logLevel
     * @param  {...any} data
     */
    static log(logLevel, ...data) {
        let method;
        let doStack = true;
        switch (logLevel) {
            case GOVBRPlataformaLogsLevel.DEBUG:
                if (!GOVBRPlataformaLogs.isDevelop) {
                    return;
                }
                method = console.debug;
                break;
            case GOVBRPlataformaLogsLevel.WARN:
            case GOVBRPlataformaLogsLevel.INFO:
                if (!GOVBRPlataformaLogs.isDevelop && !GOVBRPlataformaLogs.isHomolog) {
                    return;
                }
                method = logLevel === GOVBRPlataformaLogsLevel.WARN ? console.warn : console.log;
                break;
            case GOVBRPlataformaLogsLevel.ERROR:
            case GOVBRPlataformaLogsLevel.FATAL:
                method = console.error;
                doStack = false;
                break;
            default:
                data = [logLevel].concat(data);
                logLevel = GOVBRPlataformaLogsLevel.INFO;
                break;
        }
        if (doStack) {
            let stack = new Error().stack.split('\n');
            stack.shift();
            stack.shift();
            if (stack[0].includes('GOVBRPlataformaLogs.')) {
                stack.shift();
            }
            data.push('\n' + stack.join('\n'));
        }
        (method || console.log).apply(console, [new Date().toLocaleString() + ' - [' + (logLevel || '') + '] -'].concat(data));
    }

    /**
     * @param  {...any} data
     */
    static fatal(...data) {
        GOVBRPlataformaLogs.log(GOVBRPlataformaLogsLevel.FATAL, ...data);
    }

    /**
     * @param  {...any} data
     */
    static error(...data) {
        GOVBRPlataformaLogs.log(GOVBRPlataformaLogsLevel.ERROR, ...data);
    }

    /**
     * @param  {...any} data
     */
    static info(...data) {
        GOVBRPlataformaLogs.log(GOVBRPlataformaLogsLevel.INFO, ...data);
    }

    /**
     * @param  {...any} data
     */
    static warn(...data) {
        GOVBRPlataformaLogs.log(GOVBRPlataformaLogsLevel.WARN, ...data);
    }

    /**
     * @param  {...any} data
     */
    static debug(...data) {
        GOVBRPlataformaLogs.log(GOVBRPlataformaLogsLevel.DEBUG, ...data);
    }
}
GOVBRPlataformaLogs.init();

export { GOVBRPlataformaLogs };
