/**
 * Librairie de fonctions utilitaires de manipulation de couleurs.
 *
 * @module
 */
export const COLOR_GRADIENT_EXCEL_RED_YELLOW_GREEN = [
    { pct: 0.0, color: { r: 0xf8, g: 0x69, b: 0x6b, a: 1 } }, // #f8696b
    { pct: 0.5, color: { r: 0xff, g: 0xeb, b: 0x84, a: 1 } }, // #ffeb84
    { pct: 1.0, color: { r: 0x63, g: 0xbe, b: 0x7b, a: 1 } } // #63be7b
];

export const COLOR_GRADIENT_WHITE_GREEN = [
    { pct: 0.0, color: { r: 0xff, g: 0xff, b: 0xff, a: 1 } }, // #ffffff
    { pct: 1.0, color: { r: 0x63, g: 0xbe, b: 0x7b, a: 1 } } // #63be7b
];

export const COLOR_GRADIENT_DEFAULT = COLOR_GRADIENT_EXCEL_RED_YELLOW_GREEN;

export const COULEUR_ERREUR = 'rgba(255,255,0,1)';

/**
 * Retourne une couleur correspondant à un pourcentage.
 *
 * @param {number} pct - Pourcentage (nombre entre entre 0 et 1)
 * @param {number} opacity - Opacité (nombre entre 0 et 1 ; 1 par défaut)
 * @param {Array} gradientDefinition - Définition du gradient de couleurs à utiliser (par défaut )
 * @returns code couleur CSS au format rgba(...)
 *
 * @author Mr. @Jacob
 * @see http://stackoverflow.com/a/7128796/3786841
 */
export function getColorForPercentage(_pct, opacity = 1, gradientDefinition = COLOR_GRADIENT_DEFAULT, errorColor = null) {
    if (_pct < 0 || _pct > 1) {
        //console.warn('getColorForPercentage : valeur incorrecte=' + _pct);
        if (errorColor === true) {
            return COULEUR_ERREUR;
        } else if (errorColor) {
            return errorColor;
        }
    }

    const pct = Math.max(0, Math.min(1, _pct));

    let i;
    for (i = 1; i < gradientDefinition.length - 1; i++) {
        if (pct < gradientDefinition[i].pct) {
            break;
        }
    }

    const lower = gradientDefinition[i - 1];
    const upper = gradientDefinition[i];

    const range = upper.pct - lower.pct;
    const rangePct = (pct - lower.pct) / range;

    const pctLower = 1 - rangePct;
    const pctUpper = rangePct;

    const color = {
        r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),
        g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),
        b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper),
        a: (lower.color.a * pctLower + upper.color.a * pctUpper) * opacity
    };

    return 'rgba(' + [color.r, color.g, color.b, opacity].join(',') + ')';
}
