import { clamp, floatFromPercent } from './ColorHelpers.js';
import { ColorFactory } from './ColorFactory.js';
var DEFAULT_DARK = ColorFactory.create('#333333');
var DEFAULT_LIGHT = ColorFactory.create('#fff');
var ColorFunctionsCache = Object.create(null);
var buildCacheKey = function (name) {
    var args = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
    }
    return "".concat(name, "(").concat(args.join(), ")");
};
var shiftColor = function (colorString, a, sign, method) {
    if (!colorString) {
        return '';
    }
    if (colorString.toLowerCase() === 'transparent') {
        return 'transparent';
    }
    var amount;
    if (typeof a === 'string') {
        amount = a.endsWith('%') ? floatFromPercent(a) : parseFloat(a);
    }
    else {
        amount = a;
    }
    amount = clamp(amount, 1);
    var color = ColorFactory.create(colorString);
    var hsl = color.toHSL();
    if (sign === '+') {
        hsl.l += method === 'relative' ? hsl.l * amount : amount;
    }
    else {
        hsl.l -= method === 'relative' ? hsl.l * amount : amount;
    }
    hsl.l = clamp(hsl.l);
    var newColor;
    if (color.alpha < 1) {
        newColor = ColorFactory.create("hsla(".concat(hsl.h, ", ").concat(hsl.s, ", ").concat(hsl.l, ", ").concat(hsl.a, ")"));
    }
    else {
        newColor = ColorFactory.create("hsl(".concat(hsl.h, ", ").concat(hsl.s, ", ").concat(hsl.l, ")"));
    }
    return newColor.toColorString(color.type);
};
/**
 * @deprecated Устарело в пользу нативного CSS color-mix(). Будет удалено в версии 7.0.
 * Пример: color: color-mix(in srgb, #3498db, white 20%);
 */
export function lighten(colorString, amount, method) {
    var key = buildCacheKey('lighten', colorString, amount, method);
    if (ColorFunctionsCache[key] === undefined) {
        ColorFunctionsCache[key] = shiftColor(colorString, amount, '+', method);
    }
    return ColorFunctionsCache[key];
}
/**
 * @deprecated Устарело в пользу нативного CSS color-mix(). Будет удалено в версии 7.0.
 * Пример: color: color-mix(in srgb, #3498db, black 20%);
 */
export function darken(colorString, amount, method) {
    var key = buildCacheKey('darken', colorString, amount, method);
    if (ColorFunctionsCache[key] === undefined) {
        ColorFunctionsCache[key] = shiftColor(colorString, amount, '-', method);
        return ColorFunctionsCache[key];
    }
    return ColorFunctionsCache[key];
}
/**
 * @deprecated Устарело. Рекомендуется использовать CSS Relative Color Syntax или CSS-переменные. Будет удалено в версии 7.0.
 */
export function contrast(colorString, darkString, lightString, threshold) {
    var _a;
    if (threshold === void 0) { threshold = 0.43; }
    var key = buildCacheKey('contrast', colorString, darkString, lightString, threshold);
    if (!colorString) {
        ColorFunctionsCache[key] = '';
    }
    if (ColorFunctionsCache[key] === undefined) {
        var color = ColorFactory.create(colorString);
        var dark = typeof darkString === 'undefined' ? DEFAULT_DARK : ColorFactory.create(darkString);
        var light = typeof lightString === 'undefined' ? DEFAULT_LIGHT : ColorFactory.create(lightString);
        // Figure out which is actually light and dark:
        if (dark.luma() > light.luma()) {
            _a = [light, dark], dark = _a[0], light = _a[1];
        }
        if (color.luma() < threshold) {
            ColorFunctionsCache[key] = light.alpha < 1 ? light.toRGBString() : light.toHEXString();
        }
        else {
            ColorFunctionsCache[key] = dark.alpha < 1 ? dark.toRGBString() : dark.toHEXString();
        }
    }
    return ColorFunctionsCache[key];
}
/** @deprecated Устарело в пользу CSS Relative Color Syntax (например, from #3498db r). Будет удалено в версии 7.0. */
export var red = function (colorString) {
    var color = ColorFactory.create(colorString);
    return color.rgb[0];
};
/** @deprecated Устарело в пользу CSS Relative Color Syntax (например, from #3498db g). Будет удалено в версии 7.0. */
export var green = function (colorString) {
    var color = ColorFactory.create(colorString);
    return color.rgb[1];
};
/** @deprecated Устарело в пользу CSS Relative Color Syntax (например, from #3498db b). Будет удалено в версии 7.0. */
export var blue = function (colorString) {
    var color = ColorFactory.create(colorString);
    return color.rgb[2];
};
/** @deprecated Устарело в пользу CSS Relative Color Syntax или color-mix. Будет удалено в версии 7.0. */
export var alpha = function (colorString) {
    var color = ColorFactory.create(colorString);
    return color.alpha;
};
/** @deprecated Устарело. Валидация на стороне JS не требуется при использовании нативного CSS. Будет удалено в версии 7.0. */
export var isValid = function (colorString) {
    try {
        ColorFactory.create(colorString);
        return true;
    }
    catch (e) {
        return false;
    }
};
/**
 * @deprecated Устарело в пользу нативного CSS color-mix(). Будет удалено в версии 7.0.
 * Пример: color: color-mix(in srgb, #3498db, transparent 50%);
 */
export var fade = function (colorString, alpha) {
    var key = buildCacheKey('fade', colorString, alpha);
    if (ColorFunctionsCache[key] === undefined) {
        var color = ColorFactory.create(colorString).clone();
        color.alpha = alpha;
        ColorFunctionsCache[key] = color.toColorString(color.type === 'hex' ? 'rgba' : color.type);
    }
    return ColorFunctionsCache[key];
};
//# sourceMappingURL=ColorFunctions.js.map