"use client";

import {
    createContext,
    useContext,
    useEffect,
    useState,
    ReactNode,
} from "react";

import {
    translations,
    Lang,
    TranslationKey,
} from "@/lib/translations";

type LanguageContextType = {
    lang: Lang;
    changeLang: (lang: Lang) => void;
    t: (key: TranslationKey) => string;
};

const LanguageContext = createContext<LanguageContextType | null>(null);

function getCookie(name: string): string | null {
    if (typeof document === "undefined") return null;

    const value = `; ${document.cookie}`;
    const parts = value.split(`; ${name}=`);

    if (parts.length === 2) {
        return parts.pop()?.split(";").shift() || null;
    }

    return null;
}

function setCookie(name: string, value: string, days = 365) {
    if (typeof document === "undefined") return;

    const maxAge = days * 24 * 60 * 60;

    document.cookie = `${name}=${value}; path=/; max-age=${maxAge}; SameSite=Lax`;
}

export function LanguageProvider({ children }: { children: ReactNode }) {
    const [lang, setLang] = useState<Lang>("ar");
    const [mounted, setMounted] = useState(false);

    useEffect(() => {
        const savedLang = getCookie("lang");

        const defaultLang: Lang =
            savedLang === "ar" || savedLang === "en" ? savedLang : "ar";

        setLang(defaultLang);
        setCookie("lang", defaultLang);

        document.documentElement.lang = defaultLang;
        document.documentElement.dir = defaultLang === "ar" ? "rtl" : "ltr";

        setMounted(true);
    }, []);

    const changeLang = (newLang: Lang) => {
        setLang(newLang);
        setCookie("lang", newLang);

        document.documentElement.lang = newLang;
        document.documentElement.dir = newLang === "ar" ? "rtl" : "ltr";
    };

    const t = (key: TranslationKey) => {
        return translations[lang][key] || key;
    };

    if (!mounted) {
        return null;
    }

    return (
        <LanguageContext.Provider value={{ lang, changeLang, t }}>
            {children}
        </LanguageContext.Provider>
    );
}

export function useLanguage() {
    const context = useContext(LanguageContext);

    if (!context) {
        throw new Error("useLanguage must be used inside LanguageProvider");
    }

    return context;
}