text: /** @module localeUtils */
  const utils = require('./Utils.js');
  const config = require('../../config/Config.js');
  
  /**
   * Lookup table of often used languages
   * @constant
   * @type {array}
   */
  const languages = [
    {
      locale: 'en_US',
      name: 'English',
      iso6391: 'en',
      iso6392: 'eng',
      country: 'English Speaking',
    },
    {
      locale: 'pt_BR',
      name: 'Portuguese',
      iso6391: 'pt',
      iso6392: 'por',
      country: 'Brazil',
    },
    {
      locale: 'id_ID',
      name: 'Indonesian',
      iso6391: 'id',
      iso6392: 'ind',
      country: 'Indonesia',
    },
  ];
  
  /**
   * Splits a locale into language and region but only returns language
   * @param {string} locale a string of language_region for example: "en_GB"
   * @return {string} the language part of a locale
   */
  function extractLanguageFromLocale(locale) {
    return locale.split('_')[0];
  }
  
  /**
   * Splits a locale into language and region but only returns language
   * @param {string} locale a string of language_region for example: "en_GB"
   * @return {string} the language part of a locale
   */
  function extractRegionFromLocale(locale) {
    return locale.split('_')[1];
  }
  
  /**
   * @param {string} language the language you want to look up
   * @return {string} an ISO6392 language code string
   */
  function lookupISO6392(language) {
    return utils.getObjectFromObjectArray(languages, language).iso6392;
  }
  
  /**
   * @param {string} language the language you want to look up
   * @return {string} an ISO6391 language code string
   */
  function lookupISO6391(language) {
    return utils.getObjectFromObjectArray(languages, language).iso6391;
  }
  
  /**
   * Get the region for a specific timezone
   * @param {Integer} timezone The timezone of the user runs from 0 to 12
   * @return {String} the region that the user is in
   */
  function regionByTimeZone(timezone) {
    if (timezone < 0) {
      return 'por';
    } else if (timezone > 3) {
      return 'ind';
    } else {
      return 'default';
    }
  }
  
  /**
   * First try timezone, if it fails try locale, if that fails use default
   * @param {String} timezone of the user from FB
   * @param {string} locale a language_region string for example: "en_GB"
   * @return {string} name of a country
   */
  function lookupCountry({timezone, locale}) {
    if (timezone || locale) {
      let value;
      if (regionByTimeZone(timezone) !== 'default') {
        value = regionByTimeZone(timezone);
      } else if (locale) {
        value = extractLanguageFromLocale(locale);
      } else {
        value = 'eng';
      }
      return utils.getObjectFromObjectArray(languages, value).country;
    } else {
      throw new Error('Provide a locale or timezone');
    }
  }
  
  /**
   * First try locale, if it fails try timezone, if that fails use default
   * @param {String} locale of the user from FB
   * @param {String} timezone of the user from FB
   * @return {String} language as a ISO6392 string
   */
  function pickLanguage({locale, timezone}) {
    if (locale) {
      const lang = extractLanguageFromLocale(locale) || config.defaultLanguage;
      return lookupISO6392(lang);
    } else {
      const region = regionByTimeZone(timezone);
      const lang = region == 'default' ? config.defaultLanguage : region;
      return lookupISO6392(lang);
    }
  }
  
  module.exports = {
    languages,
    pickLanguage,
    lookupISO6391,
    lookupISO6392,
    lookupCountry,
    regionByTimeZone,
    extractLanguageFromLocale,
    extractRegionFromLocale,
  };
  