/**
 * Localizing script for SVG-edit UI.
 * @module locale
 * @license MIT
 *
 * @copyright 2010 Narendra Sisodya
 * @copyright 2010 Alexis Deveria
 *
 */

 import i18next from 'i18next';

/**
 * Used, for example, in the ImageLibs extension, to present libraries
 * (with name/URL/description) in order.
 * @typedef {GenericArray<module:locale.LocaleStrings>} module:locale.LocaleArray
*/
/**
 * The string keys of the object are two-letter language codes.
 * @tutorial LocaleDocs
 * @typedef {PlainObject<string, string|module:locale.LocaleStrings|module:locale.LocaleArray>} module:locale.LocaleStrings
 */
// keyed to an array of objects with "id" and "title" or "textContent" properties
/**
 * @typedef {PlainObject<string, string>} module:locale.LocaleSelectorValue
 */

let langParam;

/**
* The "data" property is generally set to an an array of objects with
*   "id" and "title" or "textContent" properties.
* @typedef {PlainObject} module:locale.AddLangExtensionLocaleData
* @property {module:locale.LocaleStrings[]} data See {@tutorial LocaleDocs}
*/

/**
* @interface module:locale.LocaleEditorInit
*/
/**
 * @function module:locale.LocaleEditorInit#addLangData
 * @param {string} langParam
 * @returns {module:locale.AddLangExtensionLocaleData}
*/
/**
* @typedef {PlainObject} module:locale.LangAndData
* @property {string} langParam
* @property {module:locale.LocaleStrings} langData
*/

/**
 *
 * @function module:locale.putLocale
 * @param {string} givenParam
 * @param {string[]} goodLangs
 * @fires module:svgcanvas.SvgCanvas#event:ext_addLangData
 * @fires module:svgcanvas.SvgCanvas#event:ext_langReady
 * @fires module:svgcanvas.SvgCanvas#event:ext_langChanged
 * @returns {Promise<module:locale.LangAndData>} Resolves to result of {@link module:locale.readLang}
*/

export const putLocale = async function (givenParam, goodLangs) {
  if (givenParam) {
    langParam = givenParam;
  } else if (navigator.userLanguage) { // Explorer
    langParam = navigator.userLanguage;
  } else if (navigator.language) { // FF, Opera, ...
    langParam = navigator.language;
  }

  // Set to English if language is not in list of good langs
  if (!goodLangs.includes(langParam) && langParam !== 'test') {
    langParam = 'en';
  }
  // eslint-disable-next-line no-unsanitized/method
  const module = await import(`./locale/lang.${encodeURIComponent(langParam)}.js`);
  i18next.init({
    lng: langParam,
    debug: false,
    resources: {
      [langParam]: {
        translation: module.default,
      }
    }
  });
  console.info(`Lang: ${i18next.t('lang')}`);
  return { langParam, i18next };
};
