// tslint:disable:file-header

/**
 * Npm module for Unicode CLDR JSON data
 *
 * @license
 * Copyright 2013 Rafael Xavier de Souza
 * Released under the MIT license
 * https://github.com/rxaviers/cldr-data-npm/blob/master/LICENSE-MIT
 */

'use strict';

const JSON_EXTENSION = /^(.*)\.json$/;

const assert = require('assert');
const _fs = require('fs');
const _path = require('path');

function argsToArray(arg) {
  return [].slice.call(arg, 0);
}

function jsonFiles(dirName) {
  const fileList = _fs.readdirSync(_path.join(__dirname, 'cldr-data', dirName));

  return fileList.reduce(function(sum, file) {
    if (JSON_EXTENSION.test(file)) {
      return sum.concat(file.match(JSON_EXTENSION)[1]);
    }
  }, []);
}

function cldrData(path /*, ...*/) {
  assert(
      typeof path === 'string', 'must include path (e.g., ' +
          '"main/en/numbers" or "supplemental/likelySubtags")');

  if (arguments.length > 1) {
    return argsToArray(arguments).reduce(function(sum, path) {
      sum.push(cldrData(path));
      return sum;
    }, []);
  }
  return require('./cldr-data/' + path);
}

function mainPathsFor(locales) {
  return locales.reduce(function(sum, locale) {
    const mainFiles = jsonFiles(_path.join('main', locale));
    mainFiles.forEach(function(mainFile) { sum.push(_path.join('main', locale, mainFile)); });
    return sum;
  }, []);
}

function supplementalPaths() {
  const supplementalFiles = jsonFiles('supplemental');

  return supplementalFiles.map(function(supplementalFile) {
    return _path.join('supplemental', supplementalFile);
  });
}

Object.defineProperty(
    cldrData, 'availableLocales',
    {get: function() { return cldrData('availableLocales').availableLocales; }});

cldrData.all = function() {
  const paths = supplementalPaths().concat(mainPathsFor(this.availableLocales));
  return cldrData.apply({}, paths);
};

cldrData.entireMainFor = function(locale /*, ...*/) {
  assert(
      typeof locale === 'string', 'must include locale (e.g., ' +
          '"en")');
  return cldrData.apply({}, mainPathsFor(argsToArray(arguments)));
};

cldrData.entireSupplemental = function() {
  return cldrData.apply({}, supplementalPaths());
};

module.exports = cldrData;