export const ID_SIZE = 32;

export function unifySlug(slug: string | string[]): string
{
    return (Array.isArray(slug) ? slug.join('/') : slug);
}
export function getID(length: number)
{
    for (var id = [], i = 0; i < length; i++)
        id.push((16 * Math.random() | 0).toString(16));
    return id.join("");
}
export function parsePath(path: string): string
{
    return path.toLowerCase().replaceAll(" ", "-").normalize("NFD").replaceAll(/[\u0300-\u036f]/g, "").replaceAll('(', '').replaceAll(')', '');
}
export function parseId(id: string | undefined): string |undefined
{
    return id?.normalize('NFD')?.replace(/[\u0300-\u036f]/g, '')?.replace(/^\d\. */g, '')?.replace(/\s/g, "-")?.replace(/%/g, "-percent")?.replace(/\?/g, "-q")?.toLowerCase();
}
export function padLeft(text: string, pad: string, length: number): string
{
    return text.concat(pad.repeat(length - text.length));
}
export function padRight(text: string, pad: string, length: number): string
{
    return pad.repeat(length - text.length).concat(text);
}
export function format(date: Date, template: string): string
{
    const transforms: Record<string, (date: Date) => string> = {
        "yyyy": (date: Date) => date.getUTCFullYear().toString(),
        "MM": (date: Date) => padRight((date.getUTCMonth() + 1).toString(), '0', 2),
        "dd": (date: Date) => padRight(date.getUTCDate().toString(), '0', 2),
        "mm": (date: Date) => padRight(date.getUTCMinutes().toString(), '0', 2),
        "HH": (date: Date) => padRight(date.getUTCHours().toString(), '0', 2),
        "ss": (date: Date) => padRight(date.getUTCSeconds().toString(), '0', 2),
    };
    const keys = Object.keys(transforms);

    for(const key of keys)
    {
        template = template.replaceAll(key, () => transforms[key](date));
    }

    return template;
}
export function clamp(x: number, min: number, max: number): number
{
    return x > max ? max : x < min ? min : x;
}
export function lerp(x: number, a: number, b: number): number
{
    return (1-x)*a+x*b;
}