"use client";

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

export type TenantConfig = {
  id: number;
  slug: string;
  customDomain: string | null;
  brandName: string;
  legalName: string;
  tagline: string;
  logoUrl: string | null;
  faviconUrl: string | null;
  appName: string | null;
  androidAppUrl: string | null;
  iosAppUrl: string | null;
  supportEmail: string;
  phonePrimary: string;
  phoneSecondary: string | null;
  whatsapp: string | null;
  address: string | null;
  city: string | null;
  state: string | null;
  pincode: string | null;
  gstin: string | null;
  country: string;
  currency: string;
  defaultLanguage: string;
  supportedLanguages: string[];
  primaryColor: string;
  secondaryColor: string;
  accentColor: string;
  heroTitle: string;
  heroSubtitle: string;
  footerText: string | null;
  status: string;
  plan: string;
};

type TenantContextValue = {
  tenant: TenantConfig;
  language: string;
  setLanguage: (language: string) => void;
  t: (key: TranslationKey) => string;
  formatMoney: (value: number) => string;
  refreshTenant: () => Promise<void>;
};

const fallbackTenant: TenantConfig = {
  id: 0, slug: "e-zahra", customDomain: "e.zahratech.online", brandName: "e-Zahra",
  legalName: "e-Zahra Tech", tagline: "Smart shopping, made simple",
  logoUrl: null, faviconUrl: null, appName: "e-Zahra App", androidAppUrl: null, iosAppUrl: null,
  supportEmail: "admin@e.zahratech.online",
  phonePrimary: "+8801711470336", phoneSecondary: null, whatsapp: "+8801711470336",
  address: "House no-21, Road-8, Block-A, Bosila City Developers", city: "Dhaka", state: "Dhaka", pincode: "1207", gstin: null,
  country: "Bangladesh", currency: "BDT", defaultLanguage: "en", supportedLanguages: ["en", "bn"],
  primaryColor: "#087f5b", secondaryColor: "#073b3a", accentColor: "#f4b942",
  heroTitle: "Everything you need, delivered with care.",
  heroSubtitle: "Discover trusted products, local sellers and smart deals from e-Zahra in Bangladesh.",
  footerText: "e-Zahra is your trusted multivendor marketplace for convenient shopping and reliable delivery.",
  status: "active", plan: "enterprise",
};

const translations = {
  en: {
    shopNow: "Shop now", search: "Search for products, brands and more", becomeSeller: "Become a Seller",
    affiliate: "Affiliate", trackOrder: "Track Order", signUp: "Sign up", cart: "Cart",
    freeDeliveryBanner: "Free express delivery on your first order above ₹499", topDeals: "Top deals of the day",
    handpicked: "Handpicked for you", viewAll: "View all", addToCart: "Add to cart",
    securePayments: "Secure payments", easyReturns: "Easy returns", shopTopDeals: "Shop top deals",
    earnWithUs: "Earn with us", freeDelivery: "Free delivery", securePayment: "Secure payment",
    support: "Here to help", searchMobile: "Search products and brands", home: "Home", explore: "Explore",
    orders: "Orders", everything: "Everything you love,", priceLove: "at prices you’ll love.",
    verifiedCheckout: "Verified & secure checkout", language: "Language", contact: "Contact",
  },
  hi: {
    shopNow: "अभी खरीदें", search: "उत्पाद, ब्रांड और अधिक खोजें", becomeSeller: "विक्रेता बनें",
    affiliate: "एफिलिएट", trackOrder: "ऑर्डर ट्रैक करें", signUp: "साइन अप", cart: "कार्ट",
    freeDeliveryBanner: "₹499 से अधिक के पहले ऑर्डर पर मुफ़्त एक्सप्रेस डिलीवरी", topDeals: "आज के बेहतरीन ऑफ़र",
    handpicked: "आपके लिए चुना गया", viewAll: "सभी देखें", addToCart: "कार्ट में जोड़ें",
    securePayments: "सुरक्षित भुगतान", easyReturns: "आसान वापसी", shopTopDeals: "ऑफ़र खरीदें",
    earnWithUs: "हमारे साथ कमाएँ", freeDelivery: "मुफ़्त डिलीवरी", securePayment: "सुरक्षित भुगतान",
    support: "हम सहायता के लिए हैं", searchMobile: "उत्पाद और ब्रांड खोजें", home: "होम", explore: "खोजें",
    orders: "ऑर्डर", everything: "आपकी पसंद की हर चीज़,", priceLove: "आपकी पसंद की कीमत पर।",
    verifiedCheckout: "सत्यापित और सुरक्षित चेकआउट", language: "भाषा", contact: "संपर्क",
  },
  bn: {
    shopNow: "এখনই কিনুন", search: "পণ্য, ব্র্যান্ড ও আরও কিছু খুঁজুন", becomeSeller: "বিক্রেতা হোন",
    affiliate: "অ্যাফিলিয়েট", trackOrder: "অর্ডার ট্র্যাক করুন", signUp: "সাইন আপ", cart: "কার্ট",
    freeDeliveryBanner: "₹499-এর বেশি প্রথম অর্ডারে বিনামূল্যে এক্সপ্রেস ডেলিভারি", topDeals: "আজকের সেরা অফার",
    handpicked: "আপনার জন্য বাছাই করা", viewAll: "সব দেখুন", addToCart: "কার্টে যোগ করুন",
    securePayments: "নিরাপদ পেমেন্ট", easyReturns: "সহজ রিটার্ন", shopTopDeals: "অফার কিনুন",
    earnWithUs: "আমাদের সঙ্গে আয় করুন", freeDelivery: "বিনামূল্যে ডেলিভারি", securePayment: "নিরাপদ পেমেন্ট",
    support: "সহায়তার জন্য আছি", searchMobile: "পণ্য ও ব্র্যান্ড খুঁজুন", home: "হোম", explore: "খুঁজুন",
    orders: "অর্ডার", everything: "আপনার পছন্দের সবকিছু,", priceLove: "পছন্দের দামে।",
    verifiedCheckout: "যাচাইকৃত নিরাপদ চেকআউট", language: "ভাষা", contact: "যোগাযোগ",
  },
  ta: {
    shopNow: "இப்போது வாங்குங்கள்", search: "பொருட்கள் மற்றும் பிராண்டுகளைத் தேடுங்கள்", becomeSeller: "விற்பனையாளராகுங்கள்",
    affiliate: "இணைப்பு", trackOrder: "ஆர்டரை கண்காணிக்க", signUp: "பதிவு", cart: "கார்ட்",
    freeDeliveryBanner: "₹499க்கு மேல் முதல் ஆர்டருக்கு இலவச விரைவு டெலிவரி", topDeals: "இன்றைய சிறந்த சலுகைகள்",
    handpicked: "உங்களுக்காக தேர்ந்தெடுக்கப்பட்டது", viewAll: "அனைத்தையும் காண்க", addToCart: "கார்டில் சேர்க்க",
    securePayments: "பாதுகாப்பான கட்டணம்", easyReturns: "எளிய திருப்பி அனுப்பல்", shopTopDeals: "சலுகைகளை வாங்குங்கள்",
    earnWithUs: "எங்களுடன் சம்பாதிக்க", freeDelivery: "இலவச டெலிவரி", securePayment: "பாதுகாப்பான கட்டணம்",
    support: "உதவ தயாராக உள்ளோம்", searchMobile: "பொருட்களைத் தேடுங்கள்", home: "முகப்பு", explore: "ஆராய்க",
    orders: "ஆர்டர்கள்", everything: "நீங்கள் விரும்பும் அனைத்தும்,", priceLove: "நீங்கள் விரும்பும் விலையில்.",
    verifiedCheckout: "சரிபார்க்கப்பட்ட பாதுகாப்பான செக்அவுட்", language: "மொழி", contact: "தொடர்பு",
  },
  te: {
    shopNow: "ఇప్పుడే కొనండి", search: "ఉత్పత్తులు, బ్రాండ్లు వెతకండి", becomeSeller: "విక్రేత అవ్వండి",
    affiliate: "అఫిలియేట్", trackOrder: "ఆర్డర్ ట్రాక్", signUp: "సైన్ అప్", cart: "కార్ట్",
    freeDeliveryBanner: "₹499 పై మొదటి ఆర్డర్‌కు ఉచిత ఎక్స్‌ప్రెస్ డెలివరీ", topDeals: "నేటి ఉత్తమ ఆఫర్లు",
    handpicked: "మీ కోసం ఎంపిక", viewAll: "అన్నీ చూడండి", addToCart: "కార్ట్‌కు జోడించండి",
    securePayments: "సురక్షిత చెల్లింపులు", easyReturns: "సులభమైన రిటర్న్స్", shopTopDeals: "ఆఫర్లు కొనండి",
    earnWithUs: "మాతో సంపాదించండి", freeDelivery: "ఉచిత డెలివరీ", securePayment: "సురక్షిత చెల్లింపు",
    support: "సహాయం కోసం ఉన్నాం", searchMobile: "ఉత్పత్తులను వెతకండి", home: "హోమ్", explore: "అన్వేషించండి",
    orders: "ఆర్డర్లు", everything: "మీరు ఇష్టపడే ప్రతిదీ,", priceLove: "మీకు నచ్చిన ధరల్లో.",
    verifiedCheckout: "ధృవీకరించిన సురక్షిత చెక్అవుట్", language: "భాష", contact: "సంప్రదించండి",
  },
  mr: {
    shopNow: "आता खरेदी करा", search: "उत्पादने आणि ब्रँड शोधा", becomeSeller: "विक्रेता बना",
    affiliate: "अफिलिएट", trackOrder: "ऑर्डर ट्रॅक करा", signUp: "साइन अप", cart: "कार्ट",
    freeDeliveryBanner: "₹499 पेक्षा जास्त पहिल्या ऑर्डरवर मोफत एक्सप्रेस डिलिव्हरी", topDeals: "आजच्या सर्वोत्तम ऑफर्स",
    handpicked: "तुमच्यासाठी निवडलेले", viewAll: "सर्व पहा", addToCart: "कार्टमध्ये जोडा",
    securePayments: "सुरक्षित पेमेंट", easyReturns: "सुलभ रिटर्न", shopTopDeals: "ऑफर्स खरेदी करा",
    earnWithUs: "आमच्यासोबत कमवा", freeDelivery: "मोफत डिलिव्हरी", securePayment: "सुरक्षित पेमेंट",
    support: "मदतीसाठी उपलब्ध", searchMobile: "उत्पादने शोधा", home: "होम", explore: "शोधा",
    orders: "ऑर्डर्स", everything: "तुमच्या आवडीचे सर्व काही,", priceLove: "तुमच्या आवडीच्या किमतीत.",
    verifiedCheckout: "सत्यापित सुरक्षित चेकआउट", language: "भाषा", contact: "संपर्क",
  },
} as const;

export type TranslationKey = keyof typeof translations.en;
export const languageNames: Record<string, string> = {
  en: "English", hi: "हिन्दी", bn: "বাংলা", ta: "தமிழ்", te: "తెలుగు", mr: "मराठी",
};

const TenantContext = createContext<TenantContextValue | null>(null);

export default function TenantProvider({ children }: { children: ReactNode }) {
  const [tenant, setTenant] = useState<TenantConfig>(fallbackTenant);
  const [language, setLanguageState] = useState("en");
  const [ready, setReady] = useState(false);

  const loadTenant = useCallback(async () => {
    const params = new URLSearchParams(window.location.search);
    const requested = params.get("tenant") || window.localStorage.getItem("active-tenant") || "e-zahra";
    const response = await fetch(`/api/tenant${requested ? `?slug=${encodeURIComponent(requested)}` : ""}`, { cache: "no-store" });
    const data = (await response.json()) as { tenant?: TenantConfig };
    const nextTenant = data.tenant || fallbackTenant;
    setTenant(nextTenant);
    window.localStorage.setItem("active-tenant", nextTenant.slug);
    document.cookie = `tenant_slug=${encodeURIComponent(nextTenant.slug)}; path=/; max-age=31536000; samesite=lax`;
    const savedLanguage = window.localStorage.getItem(`language:${nextTenant.slug}`);
    const nextLanguage = savedLanguage && nextTenant.supportedLanguages.includes(savedLanguage) ? savedLanguage : nextTenant.defaultLanguage;
    setLanguageState(nextLanguage);
    setReady(true);
  }, []);

  useEffect(() => { void loadTenant().catch(() => setReady(true)); }, [loadTenant]);
  useEffect(() => {
    if ("serviceWorker" in navigator && process.env.NODE_ENV === "production") {
      navigator.serviceWorker.register("/sw.js").catch(() => undefined);
    }
  }, []);
  useEffect(() => {
    document.documentElement.lang = language;
    document.documentElement.style.setProperty("--brand", tenant.primaryColor);
    document.documentElement.style.setProperty("--navy", tenant.secondaryColor);
    document.documentElement.style.setProperty("--sun", tenant.accentColor);
    document.title = `${tenant.brandName} — ${tenant.tagline}`;
    if (tenant.faviconUrl) {
      let favicon = document.querySelector<HTMLLinkElement>('link[rel="icon"]');
      if (!favicon) { favicon = document.createElement("link"); favicon.rel = "icon"; document.head.appendChild(favicon); }
      favicon.href = tenant.faviconUrl;
    }
  }, [tenant, language]);

  const setLanguage = useCallback((nextLanguage: string) => {
    if (!tenant.supportedLanguages.includes(nextLanguage)) return;
    setLanguageState(nextLanguage);
    window.localStorage.setItem(`language:${tenant.slug}`, nextLanguage);
  }, [tenant]);

  const value = useMemo<TenantContextValue>(() => ({
    tenant,
    language,
    setLanguage,
    t: (key) => (translations[language as keyof typeof translations] || translations.en)[key] || translations.en[key],
    formatMoney: (value) => new Intl.NumberFormat(language === "bn" ? "bn-BD" : "en-BD", {
      style: "currency",
      currency: tenant.currency,
      maximumFractionDigits: 0,
    }).format(value),
    refreshTenant: loadTenant,
  }), [tenant, language, setLanguage, loadTenant]);

  if (!ready) return <div className="grid min-h-screen place-items-center bg-[#f4f7fb]"><div className="h-10 w-10 animate-spin rounded-full border-4 border-slate-200 border-t-[#155ee9]" /></div>;
  return <TenantContext.Provider value={value}>{children}</TenantContext.Provider>;
}

export function useTenant() {
  const context = useContext(TenantContext);
  if (!context) throw new Error("useTenant must be used within TenantProvider");
  return context;
}
