/* stats-data.jsx — syntetická história a agregácie pre štatistický prehľad.
   Predtým bežalo ako IIFE hneď pri načítaní skriptu (window.HELPDESK_DATA bolo synchrónne
   hotové). Teraz je window.HELPDESK_DATA naplnené asynchrónne (loadHelpdeskData v data.jsx),
   preto je táto logika pomenovaná funkcia volaná z app.jsx po každom načítaní/zmene dát. */
window.computeHelpdeskStats = function () {
  "use strict";
  const { TIKETY, TECHNICI, SLA } = window.HELPDESK_DATA;
  const now = Date.now();
  const D = 86400000, H = 3600000;

  // deterministický pseudo-náhodný generátor (stabilné dáta naprieč reloadmi)
  let seed = 20260623;
  const rnd = () => { seed = (seed * 1103515245 + 12345) & 0x7fffffff; return seed / 0x7fffffff; };
  const ri = (a, b) => a + Math.floor(rnd() * (b - a + 1));

  const KATEGORIE = ["Hardvér", "Softvér", "Sieť", "Iné"];
  const PRIORITY = ["Nízka", "Stredná", "Vysoká", "Kritická"];

  // ---- denný trend za posledných 30 dní: nové vs vyriešené ----
  const dni = 30;
  const trend = [];
  for (let i = dni - 1; i >= 0; i--) {
    const date = new Date(now - i * D);
    const dow = date.getDay(); // 0 = ne
    const vikend = dow === 0 || dow === 6;
    const zaklad = vikend ? ri(1, 4) : ri(8, 18);
    const nove = zaklad;
    const vyriesene = Math.max(0, zaklad + ri(-3, 4) - (vikend ? 1 : 0));
    trend.push({
      ts: date.getTime(),
      label: date.toLocaleDateString("sk-SK", { day: "2-digit", month: "2-digit" }),
      den: ["Ne", "Po", "Ut", "St", "Št", "Pi", "So"][dow],
      vikend, nove, vyriesene,
    });
  }

  const sucet = (arr, k) => arr.reduce((s, x) => s + x[k], 0);
  const vyriesene30 = sucet(trend, "vyriesene");
  const nove30 = sucet(trend, "nove");
  const t7 = trend.slice(-7);
  const vyriesene7 = sucet(t7, "vyriesene");
  const nove7 = sucet(t7, "nove");
  // predchádzajúci týždeň pre delta
  const tPrev7 = trend.slice(-14, -7);
  const vyriesenePrev7 = sucet(tPrev7, "vyriesene");
  const novePrev7 = sucet(tPrev7, "nove");

  // ---- stav z aktuálnych tiketov ----
  const STAVY = ["Nový", "Priradený", "V riešení", "Čaká na zákazníka", "Vyriešený", "Zatvorený"];
  const podlaStavu = STAVY.map((s) => ({ kluc: s, pocet: TIKETY.filter((t) => t.stav === s).length }));
  const otvorene = TIKETY.filter((t) => !["Vyriešený", "Zatvorený"].includes(t.stav)).length;
  const eskalovane = TIKETY.filter((t) => t.eskalovany).length;

  // doplníme syntetické historické počty (aby koláče neboli prázdne) – distribúcia na 30 dní
  const distNad = (kluce, vahy, total) => {
    const sum = vahy.reduce((a, b) => a + b, 0);
    return kluce.map((k, i) => ({ kluc: k, pocet: Math.round(total * vahy[i] / sum) }));
  };
  const podlaPriority = distNad(PRIORITY, [3, 6, 4, 1.5], vyriesene30 + otvorene);
  const podlaKategorie = distNad(KATEGORIE, [4, 5, 3, 1.5], vyriesene30 + otvorene);

  // ---- KPI: MTTR (priemerný čas riešenia) a FRT (čas prvej odpovede) ----
  // syntetické v hodinách na základe priority
  const mttrHod = 9.4;    // priem. čas do vyriešenia
  const mttrPrev = 11.2;
  const frtHod = 1.8;     // priem. čas prvej odpovede
  const frtPrev = 2.3;

  // ---- SLA plnenie ----
  const slaSplnene = 91; // %
  const slaPrev = 87;
  const slaPorusene30 = Math.round(vyriesene30 * (100 - slaSplnene) / 100);

  // ---- najdlhšie otvorené tikety (z reálnych otvorených) ----
  const najdlhsie = TIKETY
    .filter((t) => !["Vyriešený", "Zatvorený"].includes(t.stav))
    .map((t) => ({ ...t, vek: now - t.vytvorene, poTermine: t.termin < now }))
    .sort((a, b) => b.vek - a.vek)
    .slice(0, 6);

  // ---- výkon technikov ----
  const technikVykon = TECHNICI.map((u, i) => {
    const vyr = [42, 31, 27][i] || ri(20, 40);
    const otv = TIKETY.filter((t) => t.technik === u.meno && !["Vyriešený", "Zatvorený"].includes(t.stav)).length;
    const mttr = [7.8, 10.1, 9.0][i] || (7 + rnd() * 5);
    const sla = [94, 88, 90][i] || ri(85, 96);
    return { ...u, vyriesene: vyr, otvorene: otv, mttr, sla };
  }).sort((a, b) => b.vyriesene - a.vyriesene);

  // ---- najčastejšie témy — agregované z reálneho poľa `podkategoria` na tiketoch ----
  // (rovnaká taxonómia ako výber "Téma" v detaile tiketu — dáta majú reálny pôvod, nie vymyslený zoznam)
  const temyPocty = {};
  TIKETY.forEach((t) => { const k = t.podkategoria || "Iné"; temyPocty[k] = (temyPocty[k] || 0) + 1; });
  // rozšírenie na realistický 30-dňový objem: každý reálny výskyt v aktuálnych tiketoch
  // reprezentuje historický vzorec, ktorý deterministicky škálujeme na obdobie
  const temy = Object.keys(temyPocty)
    .map((tema) => {
      const zaklad = temyPocty[tema];
      const pocet = Math.round(zaklad * ri(9, 13) + ri(0, 4));
      const trend = ri(-5, 6);
      const tikety = TIKETY.filter((t) => (t.podkategoria || "Iné") === tema).map((t) => t.cislo);
      return { tema, pocet, trend, tikety };
    })
    .sort((a, b) => b.pocet - a.pocet);

  const stats = {
    now, trend, t7,
    vyriesene30, nove30, vyriesene7, nove7, vyriesenePrev7, novePrev7,
    podlaStavu, podlaPriority, podlaKategorie,
    otvorene, eskalovane,
    mttrHod, mttrPrev, frtHod, frtPrev,
    slaSplnene, slaPrev, slaPorusene30,
    najdlhsie, technikVykon, temy,
    KATEGORIE, PRIORITY, STAVY,
  };
  window.HELPDESK_STATS = stats;
  return stats;
};
