// CENTRAL DA MARCA — Mariana Cabral · Camada de nuvem (Supabase).
// Sincroniza TODO o estado (ideias, aprovações, campanha, captações, notas…) com uma
// tabela do Supabase, para que os dados persistam de verdade e sincronizem entre
// dispositivos. Se não houver configuração, cai no localStorage — nada se perde.
// Exporta window.SV_CLOUD
(function () {
  const cfg = window.SV_CONFIG || {};
  const URL = (cfg.supabaseUrl || "").replace(/\/+$/, "");
  const KEY = cfg.supabaseKey || "";
  const ID = cfg.recordId || "mariana-cabral";
  const TABLE = cfg.table || "mc_estado";
  const enabled = !!(URL && KEY);

  let status = enabled ? "conectando" : "local"; // local | conectando | ok | salvando | erro
  const listeners = new Set();
  function setStatus(s) { status = s; listeners.forEach((f) => f(s)); }

  function endpoint(q) { return URL + "/rest/v1/" + TABLE + (q || ""); }
  function headers(extra) {
    return Object.assign({ apikey: KEY, Authorization: "Bearer " + KEY, "Content-Type": "application/json" }, extra || {});
  }

  // Busca o estado salvo na nuvem (ou null).
  async function pull() {
    if (!enabled) return null;
    setStatus("conectando");
    try {
      const r = await fetch(endpoint("?id=eq." + encodeURIComponent(ID) + "&select=dados"), { headers: headers() });
      if (!r.ok) throw new Error("HTTP " + r.status);
      const rows = await r.json();
      setStatus("ok");
      return rows && rows[0] ? rows[0].dados : null;
    } catch (e) { setStatus("erro"); return null; }
  }

  // Salva o estado na nuvem (upsert). Debounce para não bater a cada tecla.
  let timer = null, pending = null;
  function push(state) {
    if (!enabled) return;
    pending = state;
    setStatus("salvando");
    clearTimeout(timer);
    timer = setTimeout(flush, 700);
  }
  async function flush() {
    if (!enabled || !pending) return;
    const body = JSON.stringify([{ id: ID, dados: pending, atualizado_em: new Date().toISOString() }]);
    pending = null;
    try {
      const r = await fetch(endpoint("?on_conflict=id"), {
        method: "POST",
        headers: headers({ Prefer: "resolution=merge-duplicates,return=minimal" }),
        body,
      });
      if (!r.ok) throw new Error("HTTP " + r.status);
      setStatus("ok");
    } catch (e) { setStatus("erro"); }
  }

  window.SV_CLOUD = {
    enabled: () => enabled,
    configured: () => enabled,
    pull, push,
    status: () => status,
    onStatus: (fn) => { listeners.add(fn); fn(status); return () => listeners.delete(fn); },
  };
})();
