
module.exports = function (grunt) {
    grunt.registerTask('embedLocales', function () {
        var config = grunt.config('embedLocales');

        var files = grunt.file.expand(config.targetLocales);
        var embeddedContents = determineEmbeddedContent(files);

        var momentContents = grunt.file.read(config.moment);
        var modifiedContents = momentContents.replace('/* EMBED_LOCALES */', function () {
            // If we don't do this, $ symbols in locale files may get interpreted in
            // the regex replacement
            return embeddedContents;
        });

        grunt.file.write(config.dest, modifiedContents);
    });

    var languageReset = 'moment.locale(\'en\');';

    function determineEmbeddedContent(files) {
        var embeddedContent = '';
        files.forEach(function (file) {
            embeddedContent += transformFile(file);
        });
        embeddedContent += '\n    ' + languageReset + '\n';
        return embeddedContent;
    }

    var reTransform = /function \(factory\) \{[^]*\}(?=\(function \(moment\) \{)/gm;
    var replaceWith =
        'function (factory) {\n' +
        '    factory(moment);\n' +
        '}';

    function transformFile(file) {
        var fileContents = grunt.file.read(file);

        if (!fileContents.match(reTransform)) {
            grunt.warn('Warning: all locale files must use the common UMD wrapper pattern. Failed locale file: ' + file);
            return '';
        }

        return fileContents.replace(reTransform, replaceWith);
    }
};

