"use client";

import {
  createContext, useContext, useEffect, useState, type ReactNode,
} from "react";
import {
  listTenantCountries, listUserCountries, type TenantCountry,
} from "@/src/lib/api/countries";
import type { Me } from "@/src/lib/api/me";

// ─── Types ────────────────────────────────────────────────────────────────────

type CountryContextValue = {
  availableCountries: TenantCountry[];
  selectedCountry: TenantCountry | null;   // null = tous les pays
  setSelectedCountry: (c: TenantCountry | null) => void;
  isOwner: boolean;
  isLoaded: boolean;
};

// ─── Context ──────────────────────────────────────────────────────────────────

const CountryContext = createContext<CountryContextValue>({
  availableCountries: [],
  selectedCountry: null,
  setSelectedCountry: () => {},
  isOwner: false,
  isLoaded: false,
});

export function useCountry() {
  return useContext(CountryContext);
}

// ─── Helpers ─────────────────────────────────────────────────────────────────

function storageKey(userId: number) {
  return `acx_country_${userId}`;
}

// ─── Provider ─────────────────────────────────────────────────────────────────

export function CountryProvider({
  me,
  children,
}: {
  me: Me | null;
  children: ReactNode;
}) {
  const [availableCountries, setAvailableCountries] = useState<TenantCountry[]>([]);
  const [selectedCountry, setSelectedCountryState] = useState<TenantCountry | null>(null);
  const [isLoaded, setIsLoaded] = useState(false);

  const isOwner = (me?.is_superuser ?? false) || (me?.active_membership?.is_owner ?? false);

  useEffect(() => {
    if (!me?.id) return;

    let cancelled = false;
    setIsLoaded(false);

    (async () => {
      try {
        const countries = isOwner
          ? await listTenantCountries()
          : await listUserCountries(me.id);

        if (cancelled) return;
        setAvailableCountries(countries);

        // Restaurer le pays sélectionné depuis localStorage
        const saved = localStorage.getItem(storageKey(me.id));
        if (saved && countries.length > 0) {
          const found = countries.find((c) => c.country_code === saved);
          if (found) setSelectedCountryState(found);
          // Si le pays sauvegardé n'est plus disponible, on reste sur "Tous"
        } else if (countries.length === 1) {
          // Un seul pays → sélection automatique
          setSelectedCountryState(countries[0]);
        }
      } catch {
        // Silencieux — l'utilisateur verra "tous les pays"
      } finally {
        if (!cancelled) setIsLoaded(true);
      }
    })();

    return () => { cancelled = true; };
  // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [me?.id]);

  function setSelectedCountry(c: TenantCountry | null) {
    setSelectedCountryState(c);
    if (me?.id) {
      if (c) localStorage.setItem(storageKey(me.id), c.country_code);
      else localStorage.removeItem(storageKey(me.id));
    }
  }

  return (
    <CountryContext.Provider
      value={{ availableCountries, selectedCountry, setSelectedCountry, isOwner, isLoaded }}
    >
      {children}
    </CountryContext.Provider>
  );
}
