/* portal-data.jsx — dátová vrstva pre zamestnanecký portál (fáza 5, Worker transport).
   Všetkých šesť funkcií volá functions/api/[[path]].js namiesto priameho window.HELPDESK_GRAPH —
   appka tak zamestnancovi nikdy nedáva delegovaný Graph token ani SharePoint prístup. Token
   pre Worker (getPortalToken) je iný scope než technický Graph token (getToken) a Worker ho
   sám overuje (functions/api/_lib/jwt.js) — filtrovanie "je to môj tiket" a odfiltrovanie
   internej komunikácie sa deje NA SERVERI (functions/api/_lib/shape.js), nie tu.
   Signatúry funkcií (čo berú/vracajú) sú zámerne rovnaké ako v predošlej (dev) verzii —
   portal.jsx sa vďaka tomu nemení vôbec.
*/
(function () {
  "use strict";

  async function portalFetch(cesta, options) {
    const token = await window.HELPDESK_AUTH.getPortalToken();
    const res = await fetch(cesta, {
      ...options,
      headers: { Authorization: "Bearer " + token, ...(options && options.headers) },
    });
    if (!res.ok) {
      let msg = res.status + " " + res.statusText;
      try { const body = await res.json(); if (body && body.error) msg = body.error; } catch (_) {}
      throw new Error(msg);
    }
    if (res.status === 204) return null;
    return res.json();
  }

  function prilohyDoFormData(form, prilohy) {
    for (const p of prilohy || []) {
      if (p.file) form.append("subor", p.file, p.nazov);
    }
  }

  function loadMoje(ja) {
    return portalFetch("/api/portal/tikety");
  }

  // Odpoveď zamestnanca do vlákna. Server (Worker) zámerne NEVOLÁ computeNextTermin — tá
  // SLA-refreshuje termín len pri odpovedi TECHNIKA; keby odpoveď zákazníka rovnako
  // predlžovala termín, dal by sa tým maskovať skutočný stav eskalácie (presne ten problém,
  // čo sme riešili v štatistikách SLA).
  function posliOdpoved(ja, tiket, text, prilohy) {
    const form = new FormData();
    form.append("text", text);
    prilohyDoFormData(form, prilohy);
    return portalFetch("/api/portal/tikety/" + encodeURIComponent(tiket.cislo) + "/odpoved", { method: "POST", body: form });
  }

  function potvrditVyriesenie(ja, tiket) {
    return portalFetch("/api/portal/tikety/" + encodeURIComponent(tiket.cislo) + "/vyriesit", { method: "POST" });
  }

  function oznamitPretrvava(ja, tiket) {
    return portalFetch("/api/portal/tikety/" + encodeURIComponent(tiket.cislo) + "/pretrvava", { method: "POST" });
  }

  function zaznamenajSpokojnost(ja, tiket, hodnotenie) {
    return portalFetch("/api/portal/tikety/" + encodeURIComponent(tiket.cislo) + "/spokojnost", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ hodnotenie }),
    });
  }

  // Založenie nového tiketu z portálu. Číslovanie (dvojkrokový POST bez čísla → PATCH s
  // číslom odvodeným od SharePoint ID) rieši Worker rovnako, ako to predtým robil klient —
  // nikdy nekoliduje s e-mailovým ani technickým flow-om, lebo čerpá z toho istého
  // auto-increment ID stĺpca zoznamu Tickety.
  async function vytvorTiket(ja, { predmet, popis, priorita, kategoria, podkategoria, prilohy, tykaSa }) {
    const form = new FormData();
    form.append("predmet", predmet);
    form.append("popis", popis || "");
    form.append("priorita", priorita);
    form.append("kategoria", kategoria);
    form.append("podkategoria", podkategoria || "");
    if (tykaSa && tykaSa.length) form.append("tykaSa", JSON.stringify(tykaSa));
    prilohyDoFormData(form, prilohy);
    const data = await portalFetch("/api/portal/tikety", { method: "POST", body: form });
    return data.cislo;
  }

  // Vyhľadávanie kolegov (pridávanie do "Týka sa aj") — Worker volá Graph vlastnou app-only
  // identitou, portál nemá vlastný Graph prístup na priame hľadanie v adresári.
  function hladajOsoby(q) {
    return portalFetch("/api/portal/ludia?q=" + encodeURIComponent(q));
  }

  // mena je VŽDY celý nový zoznam (nie diff) — rovnaký vzor ako zmenaTykaSa na technickej
  // strane (app.jsx), PersonChips posiela celé pole pri každej zmene.
  function nastavTykaSa(ja, tiket, mena) {
    return portalFetch("/api/portal/tikety/" + encodeURIComponent(tiket.cislo) + "/tyka-sa", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ mena }),
    });
  }

  window.PORTAL_API = { loadMoje, posliOdpoved, vytvorTiket, potvrditVyriesenie, oznamitPretrvava, zaznamenajSpokojnost, hladajOsoby, nastavTykaSa };
})();
