class GOVBRPlataformaColorUtils {
    /**
     * Calcula o índice de luminosidade para uma cor Hexadecimal
     * @param {string} corHex - Formato #FFFFFF
     */
    static calculaIndiceLuminosidadeCor(corHex) {
        corHex = (corHex || '').toUpperCase();
        const tmp = corHex.match(/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/);
        if (!tmp) {
            GOVBR.logs.fatal('Erro: ', corHex, ' cor inválida');
            return 0;
        }
        const corRGB = [parseInt(tmp[1], 16), parseInt(tmp[2], 16), parseInt(tmp[3], 16)];
        // https://www.w3.org/TR/WCAG21/#dfn-relative-luminance
        const RsRGB = corRGB[0] / 255;
        const GsRGB = corRGB[1] / 255;
        const BsRGB = corRGB[2] / 255;

        const R = RsRGB < 0.04045 ? RsRGB / 12.92 : Math.pow((RsRGB + 0.055) / 1.055, 2.4);
        const G = GsRGB < 0.04045 ? GsRGB / 12.92 : Math.pow((GsRGB + 0.055) / 1.055, 2.4);
        const B = BsRGB < 0.04045 ? BsRGB / 12.92 : Math.pow((BsRGB + 0.055) / 1.055, 2.4);

        const luminosidade = Math.round((0.2126 * R + 0.7152 * G + 0.0722 * B) * 10000) / 10000;
        GOVBR.logs.debug('Luminosidade: ', corHex, ': ' + luminosidade);
        return luminosidade;
    }

    /**
     * Calcula a cor de texto baseada no hexadecimal da cor de fundo.
     * @param {string} corFundoHex - Formato #FFFFFF
     */
    static calculaCorTextoFundo(corFundoHex) {
        return this.calculaIndiceLuminosidadeCor(corFundoHex) > 0.4 ? '#333333' : '#EFEFEF';
    }
}

export { GOVBRPlataformaColorUtils };
