// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

'use strict';

var path = require('path');
var yaml = require('js-yaml');

var util = require('./util');

// constants
var LANGUAGE_MAP = {
    'de': 'Deutsch',
    'en': 'English',
    'es': 'Español',
    'fr': 'Français',
    'it': 'Italiano',
    'ja': '日本語',
    'ko': '한국어',
    'pl': 'Polski',
    'ru': 'Русский',
    'sl': 'Slovene',
    'zh-cn': '简体中文',
    'zh-tw': '繁體中文'
};

function main () {

    var scriptName = process.argv[1];
    var rootDir = process.argv[2];
    var config = {};

    if (!rootDir) {
        console.error('Please specify a directory from which to generate.');
        process.exit(1);
    }

    // go through directory that contains all languages
    util.listdirsSync(rootDir).forEach(function (langId) {

        var langPath = path.join(rootDir, langId);
        var versionNames = util.listdirsSync(langPath);

        // get language ID
        var langName = LANGUAGE_MAP[langId];
        if (!langName) {
            console.error("Language identifier '" + langId + "' doesn't have an associated name. Please fix that by changing " + scriptName + '.');
            process.exit(1);
        }

        // set the language name and the versions it has
        config[langId] = {
            'name': langName,
            'versions': versionNames
        };
    });

    console.log(util.generatedBy(__filename));
    console.log(yaml.dump(config, { indent: 4 }));
}

main();
