module.exports = {
    ngNameToDisplayName: ngNameToDisplayName,
    ngNameToClassName: ngNameToClassName,
    dekebabifyName: dekebabifyName,
    kebabifyClassName: kebabifyClassName,
    classTypes: ['component', 'dialog', 'directive', 'model', 'pipe', 'service', 'widget']
};

function ngNameToDisplayName(ngName) {
    const mainSections = ngName.split('.');
    mainSections[0] = dekebabifyName(mainSections[0]);
    return mainSections.join(' ');
}

function initialCap(str) {
    return str[0].toUpperCase() + str.substr(1);
}

function ngNameToClassName(rawName, nameExceptions) {
    if (nameExceptions[rawName]) return nameExceptions[rawName];

    const name = rawName.replace(/\]|\(|\)/g, '');

    const fileNameSections = name.split('.');
    const compNameSections = fileNameSections[0].split('-');

    let outCompName = '';

    for (let i = 0; i < compNameSections.length; i++) {
        outCompName = outCompName + initialCap(compNameSections[i]);
    }

    let itemTypeIndicator = '';

    if (fileNameSections.length > 1) {
        itemTypeIndicator = initialCap(fileNameSections[1]);
    }

    return outCompName + itemTypeIndicator;
}

function dekebabifyName(name) {
    let result = name.replace(/-/g, ' ');
    result = result.substr(0, 1).toUpperCase() + result.substr(1);
    return result;
}

function kebabifyClassName(name) {
    let result = name.replace(/(Component|Directive|Interface|Model|Pipe|Service|Widget)$/, (match) => {
        return '.' + match.toLowerCase();
    });

    result = result.replace(/([A-Z])/g, '-$1');
    return result.substr(1).toLowerCase();
}