// app/guest-identity.jsx — Contexte global de l'invité identifié.
//
// L'app stocke l'identité de l'invité dans localStorage avec TTL (30 jours
// par défaut). On expose un Provider + hook useGuest() pour pré-remplir les
// formulaires partout (anecdotes, carnet, paris, quiz…) et personnaliser
// l'accueil ("Bonjour Camille").
//
// Forme `identity` :
//   {
//     name:       "Camille Martin",
//     firstName:  "Camille",
//     lastName:   "Martin",
//     source:     "match" | "manual",     // match = trouvé via fuzzy / manual = saisie libre
//     inviteId:   "i-abc" | null,         // id backend si match
//     tableId:    "t1" | null,
//     tableName:  "Table 1" | null,
//     giteId:     "fournil" | null,
//     giteName:   "Fournil" | null,
//     rsvpStatut: "oui" | "non" | "en_attente" | null,
//   }

const IDENTITY_KEY   = "ea-app:identity";
const IDENTITY_TTL_DAYS = 30;
const IDENTITY_TTL_MS = IDENTITY_TTL_DAYS * 24 * 3600 * 1000;

function readStoredIdentity() {
  try {
    const raw = localStorage.getItem(IDENTITY_KEY);
    if (!raw) return null;
    const { identity, at } = JSON.parse(raw);
    if (!at || (Date.now() - at) > IDENTITY_TTL_MS) {
      localStorage.removeItem(IDENTITY_KEY);
      return null;
    }
    return identity || null;
  } catch { return null; }
}

function writeStoredIdentity(identity) {
  try {
    if (!identity) localStorage.removeItem(IDENTITY_KEY);
    else localStorage.setItem(IDENTITY_KEY, JSON.stringify({ identity, at: Date.now() }));
  } catch {}
}

// Splits "Camille Martin" → { firstName: "Camille", lastName: "Martin" }
function splitName(full) {
  const parts = (full || "").trim().split(/\s+/).filter(Boolean);
  if (!parts.length) return { firstName: "", lastName: "" };
  if (parts.length === 1) return { firstName: parts[0], lastName: "" };
  return { firstName: parts[0], lastName: parts.slice(1).join(" ") };
}

// Construit une identité à partir d'un objet invite backend (ou ligne allGuests)
function identityFromInvite(inv, decorations = {}) {
  if (!inv) return null;
  const name = inv.name || `${inv.prenom || ""} ${inv.nom || ""}`.trim();
  const { firstName, lastName } = splitName(name);
  return {
    name,
    firstName: inv.prenom || firstName,
    lastName:  inv.nom    || lastName,
    source: "match",
    inviteId:   inv.id || null,
    tableId:    inv.tableId   || decorations.tableId   || null,
    tableName:  inv.tableName || decorations.tableName || null,
    giteId:     inv.giteId    || decorations.giteId    || null,
    giteName:   inv.giteName  || decorations.giteName  || null,
    rsvpStatut: inv.rsvp_statut || decorations.rsvpStatut || null,
  };
}

function identityFromManual(name) {
  const clean = (name || "").trim().replace(/\s+/g, " ");
  if (!clean) return null;
  const { firstName, lastName } = splitName(clean);
  return {
    name: clean,
    firstName, lastName,
    source: "manual",
    inviteId: null, tableId: null, tableName: null,
    giteId: null, giteName: null, rsvpStatut: null,
  };
}

// ─── Provider + hook ───
const GuestContext = React.createContext({
  identity: null, login: () => {}, logout: () => {},
});

function GuestProvider({ children }) {
  const [identity, setIdentity] = React.useState(() => readStoredIdentity());

  const login = React.useCallback((next) => {
    writeStoredIdentity(next);
    setIdentity(next);
  }, []);

  const logout = React.useCallback(() => {
    writeStoredIdentity(null);
    setIdentity(null);
  }, []);

  const value = React.useMemo(() => ({ identity, login, logout }), [identity, login, logout]);
  return <GuestContext.Provider value={value}>{children}</GuestContext.Provider>;
}

function useGuest() {
  return React.useContext(GuestContext);
}

Object.assign(window, {
  GuestProvider, GuestContext, useGuest,
  identityFromInvite, identityFromManual,
  readStoredIdentity, writeStoredIdentity, splitName,
  IDENTITY_TTL_DAYS,
});
