import acceptLanguage from "accept-language";
import { createInstance } from "i18next";
import resourcesToBackend from "i18next-resources-to-backend";
import { cookies as getCookies, headers as getHeaders } from "next/headers";
import { cache } from "react";
import { initReactI18next } from "react-i18next/initReactI18next";
import "server-only";
import { fallbackLng, getOptions, languages } from "./settings";

const initServerI18next = async (ns: string | undefined) => {
  const i18nInstance = createInstance();
  await i18nInstance
    .use(initReactI18next)
    .use(resourcesToBackend((language: string, ns: string) => import(`./locales/${language}/${ns}.json`)))
    .init(getOptions(ns));
  return i18nInstance;
};

acceptLanguage.languages(languages);

const cookieName = "i18next";

export async function detectLanguage() {
  const cookies = getCookies();
  const headers = getHeaders();

  let language;
   if (!language && (await cookies).has(cookieName)) {
     language = acceptLanguage.get((await cookies).get(cookieName)?.value);
   }
   if (!language) {
     language = acceptLanguage.get((await headers).get("Accept-Language"));
   }
   if (!language) {
     language = fallbackLng;
   }
   return language;
}

export const getServerTranslations = cache(async (ns: string, options: { keyPrefix?: string } = {}) => {
  const language = await detectLanguage();
  const i18nextInstance = await initServerI18next(ns);
  return {
    t: i18nextInstance.getFixedT(language, Array.isArray(ns) ? ns[0] : ns, options.keyPrefix),
    i18n: i18nextInstance,
  };
});
