/* panels.jsx — hlavné panely: zoznam tiketov, konverzácia, detail */

/* ====================== ĽAVÝ PANEL: ZOZNAM TIKETOV ====================== */
function TicketList({ tikety, vybranyCislo, onVybrat, now, jaMeno }) {
  const [hladaj, setHladaj] = useState("");
  const [filterStav, setFilterStav] = useState("Aktívne");
  const [openSort, setOpenSort] = useState(false);
  const [sort, setSort] = useState("SLA");

  const filtre = ["Aktívne", "Všetky", "Moje", "Eskalované"];
  const JA = jaMeno;
  const ZATVORENE = new Set(["Vyriešený", "Zatvorený"]);

  const zobrazene = useMemo(() => {
    let z = tikety.filter((t) => {
      const q = hladaj.trim().toLowerCase();
      if (q && !(t.cislo.toLowerCase().includes(q) || t.predmet.toLowerCase().includes(q) || t.ziadatelMeno.toLowerCase().includes(q))) return false;
      if (filterStav === "Aktívne" && ZATVORENE.has(t.stav)) return false;
      if (filterStav === "Moje" && t.technik !== JA) return false;
      if (filterStav === "Eskalované" && !t.eskalovany) return false;
      return true;
    });
    const prio = { "Kritická": 0, "Vysoká": 1, "Stredná": 2, "Nízka": 3 };
    z = z.slice().sort((a, b) => {
      if (sort === "SLA") return a.termin - b.termin;
      if (sort === "Priorita") return prio[a.priorita] - prio[b.priorita];
      return b.vytvorene - a.vytvorene; // Najnovšie
    });
    return z;
  }, [tikety, hladaj, filterStav, sort]);

  return (
    <aside className="hd-ticketlist" style={{
      display: "flex", flexDirection: "column", background: "var(--surface)",
      borderRight: "1px solid var(--stroke)", minWidth: 0, height: "100%",
    }}>
      <div style={{ padding: "14px 14px 10px", borderBottom: "1px solid var(--stroke)" }}>
        <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 12 }}>
          <div style={{ display: "flex", alignItems: "baseline", gap: 8 }}>
            <span style={{ fontSize: 16, fontWeight: 700, letterSpacing: "-.01em" }}>Tikety</span>
            <span style={{ fontSize: 12, color: "var(--text-3)", fontWeight: 600 }}>{zobrazene.length}</span>
          </div>
          <div style={{ position: "relative" }}>
            <IconBtn name="sort" title="Zoradiť" active={openSort} onClick={() => setOpenSort((v) => !v)} size={17} />
            {openSort && (
              <>
                <div onClick={() => setOpenSort(false)} style={{ position: "fixed", inset: 0, zIndex: 30 }} />
                <div style={{
                  position: "absolute", right: 0, top: 38, zIndex: 31, background: "var(--surface)",
                  border: "1px solid var(--stroke)", borderRadius: "var(--radius)", boxShadow: "var(--shadow-lg)",
                  padding: 4, minWidth: 150, animation: "hd-pop .12s ease",
                }}>
                  <div style={{ fontSize: 11, color: "var(--text-3)", fontWeight: 700, padding: "6px 10px 4px", textTransform: "uppercase", letterSpacing: ".4px" }}>Zoradiť podľa</div>
                  {["SLA", "Priorita", "Najnovšie"].map((s) => (
                    <button key={s} onClick={() => { setSort(s); setOpenSort(false); }} style={{
                      display: "flex", alignItems: "center", justifyContent: "space-between", width: "100%", gap: 8,
                      padding: "7px 10px", border: "none", background: "transparent", borderRadius: "var(--radius-sm)",
                      color: "var(--text)", fontSize: 13, textAlign: "left",
                    }} onMouseEnter={(e) => e.currentTarget.style.background = "var(--surface-3)"} onMouseLeave={(e) => e.currentTarget.style.background = "transparent"}>
                      {s} {sort === s && <Icon name="check" size={15} style={{ color: "var(--accent)" }} />}
                    </button>
                  ))}
                </div>
              </>
            )}
          </div>
        </div>

        <div style={{ position: "relative", marginBottom: 10 }}>
          <span style={{ position: "absolute", left: 9, top: "50%", transform: "translateY(-50%)", color: "var(--text-3)", pointerEvents: "none" }}>
            <Icon name="search" size={16} />
          </span>
          <input value={hladaj} onChange={(e) => setHladaj(e.target.value)} placeholder="Hľadať tiket, predmet, žiadateľa…"
            style={{
              width: "100%", padding: "8px 10px 8px 32px", borderRadius: "var(--radius-sm)",
              border: "1px solid var(--stroke-strong)", background: "var(--surface-2)", color: "var(--text)",
              fontSize: 13, fontFamily: "inherit", outline: "none",
            }}
            onFocus={(e) => e.target.style.borderColor = "var(--accent)"} onBlur={(e) => e.target.style.borderColor = "var(--stroke-strong)"} />
        </div>

        <div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
          {filtre.map((f) => {
            const aktiv = filterStav === f;
            const pocet = f === "Eskalované" ? tikety.filter((t) => t.eskalovany).length : null;
            return (
              <button key={f} onClick={() => setFilterStav(f)} style={{
                display: "inline-flex", alignItems: "center", gap: 5, padding: "5px 11px", borderRadius: 999,
                border: "1px solid " + (aktiv ? "transparent" : "var(--stroke-strong)"), whiteSpace: "nowrap",
                background: aktiv ? "var(--accent)" : "transparent", color: aktiv ? "#fff" : "var(--text-2)",
                fontSize: 12.5, fontWeight: 600, transition: "background .12s",
              }}>
                {f}
                {pocet > 0 && <span style={{ fontSize: 11, padding: "0 5px", borderRadius: 8, background: aktiv ? "rgba(255,255,255,.25)" : "var(--danger-tint)", color: aktiv ? "#fff" : "var(--red)", fontWeight: 700 }}>{pocet}</span>}
              </button>
            );
          })}
        </div>
      </div>

      <div style={{ flex: 1, overflowY: "auto", padding: "6px" }}>
        {zobrazene.length === 0 && (
          <div style={{ textAlign: "center", color: "var(--text-3)", padding: "40px 16px", fontSize: 13 }}>Žiadne tikety nezodpovedajú filtru.</div>
        )}
        {zobrazene.map((t) => (
          <TicketRow key={t.cislo} t={t} aktiv={t.cislo === vybranyCislo} onClick={() => onVybrat(t.cislo)} now={now} />
        ))}
      </div>
    </aside>
  );
}

function TicketRow({ t, aktiv, onClick, now }) {
  const [hover, setHover] = useState(false);
  const zostava = t.termin - now;
  const poTermine = zostava < 0 && !["Vyriešený", "Zatvorený"].includes(t.stav);
  const poslednaSprava = t.komunikacia[t.komunikacia.length - 1];
  const neprecitane = poslednaSprava && poslednaSprava.typ === "Prijatý e-mail" && !["Vyriešený", "Zatvorený"].includes(t.stav);

  return (
    <button onClick={onClick} onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} style={{
      display: "block", width: "100%", textAlign: "left", border: "none", marginBottom: 4,
      padding: "10px 11px 11px", borderRadius: "var(--radius)", cursor: "pointer", position: "relative",
      background: aktiv ? "var(--accent-tint)" : hover ? "var(--surface-3)" : "transparent",
      boxShadow: aktiv ? "inset 0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent)" : "none",
      transition: "background .1s",
    }}>
      {aktiv && <span style={{ position: "absolute", left: 0, top: 10, bottom: 10, width: 3, borderRadius: 3, background: "var(--accent)" }} />}
      <div style={{ display: "flex", alignItems: "center", gap: 7, marginBottom: 4 }}>
        <span style={{ fontSize: 12, fontWeight: 700, color: aktiv ? "var(--accent)" : "var(--text-2)", fontVariantNumeric: "tabular-nums" }}>{t.cislo}</span>
        <span style={{ width: 4 }} />
        <PriorityBadge priorita={t.priorita} small />
        {t.eskalovany && (
          <span title="Eskalovaný" style={{ display: "inline-flex", color: "var(--red)" }}><Icon name="warning" size={14} /></span>
        )}
        <span style={{ marginLeft: "auto", fontSize: 11, color: "var(--text-3)", whiteSpace: "nowrap" }}>{fmtRelative(poslednaSprava.cas)}</span>
      </div>
      <div style={{ display: "flex", alignItems: "flex-start", gap: 7 }}>
        {neprecitane && <span style={{ width: 7, height: 7, borderRadius: "50%", background: "var(--accent)", marginTop: 5, flex: "0 0 auto" }} />}
        <div style={{
          fontSize: 13.5, fontWeight: neprecitane ? 700 : 600, color: "var(--text)", lineHeight: 1.3,
          overflow: "hidden", textOverflow: "ellipsis", display: "-webkit-box", WebkitLineClamp: 2, WebkitBoxOrient: "vertical",
        }}>{t.predmet}</div>
      </div>
      <div style={{ display: "flex", alignItems: "center", gap: 6, marginTop: 7 }}>
        <StatusBadge stav={t.stav} />
        <span style={{ marginLeft: "auto", display: "inline-flex", alignItems: "center", gap: 4, fontSize: 11.5, fontWeight: 600,
          color: poTermine ? "var(--red)" : "var(--text-3)" }}>
          <Icon name="clock" size={13} />
          {["Vyriešený", "Zatvorený"].includes(t.stav) ? "—" : (poTermine ? "po termíne" : fmtCountdown(zostava).replace(/\s\d+s$/, ""))}
        </span>
      </div>
    </button>
  );
}

window.TicketList = TicketList;
