import type { AvailableLanguages } from "@/stores/user";
import i18next from "i18next";
import Backend from "i18next-locize-backend";
import { locizePlugin } from "locize";

import { nextTick } from "vue";

declare module "i18next" {
  interface CustomTypeOptions {
    returnNull: false;
  }
}

export const SUPPORT_LOCALES: AvailableLanguages[] = ["de", "fr", "it"];

export function i18nextInit() {
  return (
    i18next
      // detect user language
      // learn more: https://github.com/i18next/i18next-browser-languageDetector
      // .use(LanguageDetector)
      // init i18next
      // for all options read: https://www.i18next.com/overview/configuration-options
      .use(Backend)
      .use(locizePlugin)
      .init({
        debug: true,
        supportedLngs: SUPPORT_LOCALES,
        fallbackLng: "de",
        defaultNS: "translation",
        returnNull: false,
        saveMissing: import.meta.env.DEV,
        backend: {
          projectId:
            import.meta.env.VITE_LOCIZE_PROJECTID ||
            "7518c269-cbf7-4d25-bc5c-6ceba2a8b74b",
          apiKey: import.meta.env.DEV ? import.meta.env.VITE_LOCIZE_API_KEY : undefined,
          fallbackLng: "de",
          allowedAddOrUpdateHosts: ["localhost", "127.0.0.1"],
        },
      })
  );
}

export function setI18nLanguage(locale: string) {
  /**
   * NOTE:
   * If you need to specify the language setting for headers, such as the `fetch` API, set it here.
   * The following is an example for axios.
   *
   * axios.defaults.headers.common['Accept-Language'] = locale
   */
  i18next.changeLanguage(locale);
  document.querySelector("html")?.setAttribute("lang", locale);
}

export async function loadI18nextLocaleMessages(locale: any) {
  // load locale messages with dynamic import
  // unused with locize
  const messages = await import(`./locales/${locale}.json`);

  i18next.addResourceBundle(locale, "messages", messages, true, true);

  return nextTick();
}
