// admin-app/backend.jsx — Helpers fetch admin (avec secret obligatoire)
// Dépend de window.BACKEND défini dans backend/config.js.
//
// Toutes les écritures admin passent par le secret stocké dans
// localStorage (key = "ea-admin:secret"). Le secret est demandé au
// premier accès via la query string ?key=… puis mémorisé.

const ADMIN_SECRET_KEY = "ea-admin:secret";

function getAdminSecret() {
  return localStorage.getItem(ADMIN_SECRET_KEY) || "";
}

function setAdminSecret(s) {
  if (!s) return;
  localStorage.setItem(ADMIN_SECRET_KEY, s);
}

function clearAdminSecret() {
  localStorage.removeItem(ADMIN_SECRET_KEY);
}

// Hook : récupère un secret depuis ?key=…, le stocke, et nettoie l'URL.
function initSecretFromUrl() {
  const params = new URLSearchParams(window.location.search);
  const k = params.get("key");
  if (k) {
    setAdminSecret(k);
    // Nettoie l'URL pour ne pas laisser le secret dans l'historique
    params.delete("key");
    const newUrl = window.location.pathname + (params.toString() ? "?" + params.toString() : "") + window.location.hash;
    window.history.replaceState({}, "", newUrl);
  }
}

// Vérifie que le secret est valide (test getAll avec un appel léger)
async function pingAdmin() {
  const secret = getAdminSecret();
  if (!secret) return { ok: false, reason: "no-secret" };
  try {
    const res = await window.BACKEND.get("getAll", { secret });
    if (res?.ok) return { ok: true, data: res };
    return { ok: false, reason: res?.error || "bad-response" };
  } catch (e) {
    return { ok: false, reason: e.message };
  }
}

// Récupère toutes les données (avec secret)
async function adminGetAll() {
  const secret = getAdminSecret();
  return window.BACKEND.get("getAll", { secret });
}

// Écritures admin
async function adminAssign(field, inviteId, value) {
  const action = field === "table_id" ? "assignTable"
               : field === "gite_id"  ? "assignGite"
               : field === "chambre_id" ? "assignChambre"
               : field === "covoit_id" ? "assignCovoit"
               : null;
  if (!action) throw new Error("Champ invalide : " + field);
  const params = { secret: getAdminSecret(), invite_id: inviteId };
  params[field] = value;
  return window.BACKEND.post(action, params);
}

async function adminUpdateInvite(inviteId, patch) {
  return window.BACKEND.post("updateInvite", {
    secret: getAdminSecret(),
    invite_id: inviteId,
    patch,
  });
}

async function adminUpsertCovoit(data) {
  return window.BACKEND.post("upsertCovoit", {
    secret: getAdminSecret(),
    ...data,
  });
}

async function adminUpdateTable(tableId, patch) {
  return window.BACKEND.post("updateTable", {
    secret: getAdminSecret(),
    table_id: tableId,
    patch,
  });
}

async function adminUpdateGite(giteId, patch) {
  return window.BACKEND.post("updateGite", {
    secret: getAdminSecret(),
    gite_id: giteId,
    patch,
  });
}

// Bulk assign : envoie N op\u00e9rations en un seul appel HTTP.
// ops = [{ invite_id, gite_id?, chambre_id?, table_id? }, ...]
async function adminBulkAssign(ops) {
  return window.BACKEND.post("bulkAssign", {
    secret: getAdminSecret(),
    ops,
  });
}

Object.assign(window, {
  getAdminSecret, setAdminSecret, clearAdminSecret,
  initSecretFromUrl, pingAdmin,
  adminGetAll, adminAssign, adminUpdateInvite, adminUpsertCovoit,
  adminUpdateTable, adminUpdateGite, adminBulkAssign,
});
