// js/dashboard.js
(() => {
  const API = "../php/dashboard/summary.php";
  const nf = new Intl.NumberFormat("es-CL");

  async function fetchJSON(url) {
    const res = await fetch(url, { credentials: "same-origin", cache: "no-store" });
    const data = await res.json().catch(() => null);
    if (!res.ok || !data || data.ok === false) throw new Error(data?.message || "Error de servidor");
    return data;
  }

  function kpiNodes() {
    return Array.from(document.querySelectorAll(".kpi .display-6"));
  }

  function setKpi(idx, val) {
    const nodes = kpiNodes();
    if (!nodes[idx]) return;
    nodes[idx].textContent = nf.format(Number(val ?? 0));
  }

  function esc(value) {
    return String(value ?? "")
      .replaceAll("&", "&amp;")
      .replaceAll("<", "&lt;")
      .replaceAll(">", "&gt;")
      .replaceAll('"', "&quot;")
      .replaceAll("'", "&#039;");
  }

  function iconFor(modulo, accion) {
    const m = String(modulo || "").toLowerCase();
    const a = String(accion || "").toLowerCase();
    if (a.includes("login") || a.includes("sesión")) return "bi-box-arrow-in-right";
    if (a.includes("elimin")) return "bi-trash";
    if (a.includes("import")) return "bi-file-earmark-arrow-up";
    if (a.includes("actualiz")) return "bi-arrow-repeat";
    if (m.includes("persona")) return "bi-person";
    if (m.includes("familia")) return "bi-people";
    if (m.includes("vivienda")) return "bi-house";
    if (m.includes("geo")) return "bi-geo-alt";
    if (m.includes("config")) return "bi-gear";
    if (m.includes("instrument")) return "bi-clipboard2-pulse";
    return "bi-activity";
  }

  function formatDate(value) {
    if (!value) return "—";
    const d = new Date(value.replace(" ", "T"));
    if (Number.isNaN(d.getTime())) return value;
    return d.toLocaleString("es-CL", {
      day: "2-digit",
      month: "2-digit",
      hour: "2-digit",
      minute: "2-digit",
    });
  }

  function renderActividades(data) {
    const list = document.getElementById("actividadesRecientes");
    const hint = document.getElementById("actividadesHint");
    if (!list) return;

    const actividades = Array.isArray(data.actividades) ? data.actividades : [];
    const alcance = data.actividades_alcance || "";
    if (hint) {
      hint.textContent = alcance === "todas"
        ? "Administrador: viendo todas las actividades registradas."
        : "Digitador: viendo solo tus actividades registradas.";
    }

    if (!actividades.length) {
      list.innerHTML = `<div class="activity-empty text-muted small">Aún no hay actividades recientes para mostrar.</div>`;
      return;
    }

    list.innerHTML = actividades.map((a) => {
      const icon = iconFor(a.modulo, a.accion);
      const nombre = a.funcionario_nombre || a.funcionario_rut || "Usuario";
      const modulo = a.modulo || "Plataforma";
      const accion = a.accion || "Actividad";
      const descripcion = a.descripcion || "Movimiento registrado.";
      return `
        <div class="activity-item">
          <div class="activity-icon"><i class="bi ${icon}"></i></div>
          <div>
            <div class="activity-title">${esc(accion)} · ${esc(modulo)}</div>
            <div class="activity-desc">${esc(descripcion)}</div>
          </div>
          <div class="activity-meta">
            <div>${esc(nombre)}</div>
            <div>${esc(formatDate(a.fecha_registro))}</div>
          </div>
        </div>`;
    }).join("");
  }

  async function load() {
    const data = await fetchJSON(API);
    const k = data.kpis || {};
    // orden según tu HTML:
    // 0 Registros hoy, 1 No inscritos, 2 Viviendas visitadas, 3 Pendientes
    setKpi(0, k.registros_hoy);
    setKpi(1, k.no_inscritos);
    setKpi(2, k.viviendas_visitadas);
    setKpi(3, k.pendientes);
    renderActividades(data);
  }

  function wire() {
    const btn = document.getElementById("btnRecargarActividades");
    btn?.addEventListener("click", () => load().catch(console.error));
  }

  async function start() {
    try {
      wire();
      await load();
      // refresco cada 60s
      setInterval(() => load().catch(console.error), 60_000);
    } catch (e) {
      console.error(e);
      if (window.Swal) {
        Swal.fire({
          icon: "error",
          title: "Dashboard",
          text: e?.message || "No se pudo cargar el resumen.",
          confirmButtonText: "OK"
        });
      }
    }
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", start);
  } else {
    start();
  }
})();
