"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CaseConvention = void 0;
exports.convertCase = convertCase;
exports.CaseConvention = Object.freeze({
    Lowercase: 0,
    Uppercase: 1,
    PascalCase: 2,
    CamelCase: 3,
    SnakeCase: 4,
    ScreamingSnakeCase: 5,
    KebabCase: 6,
    ScreamingKebabCase: 7
});
const wordBoundaryRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;
function identifyWords(value) {
    return value && value.match(wordBoundaryRegex);
}
const lower = (ch) => ch.toLowerCase();
const upper = (ch) => ch.toUpperCase();
const first = (xs) => xs && xs[0];
const tail = (xs) => xs && xs.slice(1);
function upperFirst(xs) {
    return upper(first(xs)) + tail(xs);
}
function toPascalCase(words) {
    return words.map(lower).map(upperFirst).join('');
}
const joinMap = (fn, delim, xs) => {
    return xs.map(fn).join(delim);
};
function convertCase(value, convention) {
    const words = identifyWords(value);
    if (!words || words.length <= 0) {
        return '';
    }
    switch (convention) {
        case exports.CaseConvention.Lowercase:
            return words.join('').toLowerCase();
        case exports.CaseConvention.Uppercase:
            return words.join('').toUpperCase();
        case exports.CaseConvention.PascalCase:
            return toPascalCase(words);
        case exports.CaseConvention.CamelCase:
            const pascal = toPascalCase(words);
            return first(pascal).toLowerCase() + tail(pascal);
        case exports.CaseConvention.SnakeCase:
            return joinMap(lower, '_', words);
        case exports.CaseConvention.ScreamingSnakeCase:
            return joinMap(upper, '_', words);
        case exports.CaseConvention.KebabCase:
            return joinMap(lower, '-', words);
        case exports.CaseConvention.ScreamingKebabCase:
            return joinMap(upper, '-', words);
    }
}