import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from "react";

export type Lang = "EN" | "FR" | "PT";

export const LANGUAGES: { code: Lang; label: string }[] = [
  { code: "EN", label: "English" },
  { code: "FR", label: "Français" },
  { code: "PT", label: "Português" },
];

const DICT: Record<string, Record<Lang, string>> = {
  contact: { EN: "Contact Us", FR: "Contactez-nous", PT: "Contacte-nos" },
  search: { EN: "Search", FR: "Rechercher", PT: "Pesquisar" },
  menu: { EN: "Menu", FR: "Menu", PT: "Menu" },
  language: { EN: "Language", FR: "Langue", PT: "Idioma" },
  findSeed: { EN: "Find your seed", FR: "Trouvez votre semence", PT: "Encontre a sua semente" },
  heroEyebrow: { EN: "Seed Co Group | since 1940", FR: "Seed Co Group | depuis 1940", PT: "Seed Co Group | desde 1940" },
  heroTitle: {
    EN: "Africa's seed, bred for Africa's seasons",
    FR: "Des semences africaines, pour les saisons africaines",
    PT: "Sementes africanas, para as estações africanas",
  },
  heroBody: {
    EN: "Certified hybrid maize, wheat, soya, sorghum and legume seed developed across 40+ research and trial sites and supplied to farmers in more than 35 African countries.",
    FR: "Semences hybrides certifiées de maïs, blé, soja, sorgho et légumineuses, développées sur plus de 40 sites de recherche et fournies dans plus de 35 pays africains.",
    PT: "Sementes híbridas certificadas de milho, trigo, soja, sorgo e leguminosas, desenvolvidas em mais de 40 estações de investigação e fornecidas em mais de 35 países africanos.",
  },
  exploreProducts: { EN: "Explore our crops", FR: "Découvrir nos cultures", PT: "Ver as nossas culturas" },
  newsletter: { EN: "Newsletter", FR: "Infolettre", PT: "Newsletter" },
  subscribe: { EN: "Subscribe", FR: "S'abonner", PT: "Subscrever" },
};

type Ctx = { lang: Lang; setLang: (l: Lang) => void; t: (key: keyof typeof DICT | string) => string };

const LangContext = createContext<Ctx | null>(null);

export function LanguageProvider({ children }: { children: ReactNode }) {
  const [lang, setLang] = useState<Lang>("EN");

  const t = useCallback(
    (key: string) => {
      const entry = DICT[key];
      return entry ? entry[lang] : key;
    },
    [lang],
  );

  const value = useMemo(() => ({ lang, setLang, t }), [lang, t]);
  return <LangContext.Provider value={value}>{children}</LangContext.Provider>;
}

export function useLang() {
  const ctx = useContext(LangContext);
  if (!ctx) throw new Error("useLang must be used inside LanguageProvider");
  return ctx;
}
