// datafetch.jsx — Hydration overlay: fetch operational tables dari Supabase,
// map snake_case → shape frontend (camelCase), overwrite window.IDSS.* (key sama).
// Dashboard TAK diubah — tetap baca window.IDSS.PENERIMA_FEEDBACK dst.
//
// Non-breaking: bila Supabase tak aktif (window.sb kosong), semua fungsi no-op —
// app pakai seed statik data.jsx (mode demo). Dipanggil dari supabase.jsx saat login.
//
// Realtime: alert baru (rating rendah / checklist major) → push ke inbox DAPUR live.
(function () {
  const camel = {
    // checklist_submissions → PENERIMA_CHECKLIST_SUBMISSIONS
    checklist: (r) => ({
      id: r.id, tanggal: r.tanggal, sekolahId: r.sekolah_id, dapur: r.dapur_id,
      menu: r.menu, hasil: r.hasil, status: r.status, catatan: r.catatan,
      evaluatorNama: r.evaluator_nama, evaluatorJabatan: r.evaluator_jabatan,
    }),
    // feedback → PENERIMA_FEEDBACK
    feedback: (r) => ({
      id: r.id, tanggal: r.tanggal, sekolahId: r.sekolah_id, dapur: r.dapur_id,
      menu: r.menu, rating: r.rating, ratingRasa: r.rating_rasa,
      ratingTampilan: r.rating_tampilan, ratingPorsi: r.rating_porsi,
      feedback: r.feedback, siswaNama: r.siswa_nama, siswaKelas: r.siswa_kelas,
    }),
    // alerts → EWS_ALERTS_INBOX (shape yang dibaca dapur.jsx AlertInbox)
    alert: (r) => ({
      id: r.id, targetRole: r.target_role, sourceRole: r.source_role,
      stageName: r.judul || r.tahap, severity: r.level === "danger" ? "critical" : "warning",
      avgScore: null, status: r.status === "open" ? "open" : "forwarded",
      createdAt: r.created_at || r.waktu, sekolahId: r.sekolah_id, dapurId: r.dapur_id,
      aksi: r.aksi, refTable: r.ref_table, refId: r.ref_id,
    }),
  };

  // Ambil tabel operasional, tulis balik ke window.IDSS. RLS di server sudah
  // membatasi baris per role — client tak perlu filter ulang (defense-in-depth: tetap map apa adanya).
  async function hydrate(user) {
    const sb = window.sb;
    if (!sb || !window.IDSS) return false;
    try {
      const [cs, fb, al] = await Promise.all([
        sb.from("checklist_submissions").select("*").order("tanggal", { ascending: false }),
        sb.from("feedback").select("*").order("tanggal", { ascending: false }),
        sb.from("alerts").select("*").order("created_at", { ascending: false }),
      ]);
      if (!cs.error && cs.data) window.IDSS.PENERIMA_CHECKLIST_SUBMISSIONS = cs.data.map(camel.checklist);
      if (!fb.error && fb.data) window.IDSS.PENERIMA_FEEDBACK = fb.data.map(camel.feedback);
      if (!al.error && al.data) window.IDSS.EWS_ALERTS_INBOX = al.data.map(camel.alert);

      const errs = [cs, fb, al].filter((r) => r.error).map((r) => r.error.message);
      if (errs.length) console.warn("[datafetch] sebagian gagal:", errs.join(" | "));
      else console.info(`[datafetch] hydrated: ${cs.data?.length||0} checklist, ${fb.data?.length||0} feedback, ${al.data?.length||0} alert`);

      window.IDSSPersist?.scheduleSave?.();
      subscribeAlerts(user);
      return true;
    } catch (e) {
      console.warn("[datafetch] hydrate error (pakai seed statik):", e.message);
      return false;
    }
  }

  // Realtime: DAPUR/koordinator terima alert baru tanpa reload.
  let alertChannel = null;
  function subscribeAlerts(user) {
    const sb = window.sb;
    if (!sb || alertChannel) return; // sekali saja
    const isDapur = ["induk", "satelit", "agro"].includes(user?.role);
    if (!isDapur) return; // hanya sisi dapur/koordinator yang butuh inbox live
    alertChannel = sb
      .channel("alerts-inbox")
      .on("postgres_changes", { event: "INSERT", schema: "idss", table: "alerts" }, (payload) => {
        const a = camel.alert(payload.new);
        window.IDSS.EWS_ALERTS_INBOX = [a, ...(window.IDSS.EWS_ALERTS_INBOX || [])];
        window.IDSSPersist?.scheduleSave?.();
        window.showToast?.(`Alert baru: ${a.stageName}`, a.severity === "critical" ? "error" : "warn", 5000);
        window.dispatchEvent(new CustomEvent("idss:alert", { detail: a }));
      })
      .subscribe();
  }

  function unsubscribe() {
    if (alertChannel && window.sb) { try { window.sb.removeChannel(alertChannel); } catch (e) {} alertChannel = null; }
  }

  window.IDSSHydrate = hydrate;
  window.IDSSUnsubscribe = unsubscribe;
})();
