/* Untere Leiste des Kerns: Protokoll (Meldungen, Live-Ereignisse, Dienst) und
   Aufträge (kompakt, aus der Agenten-Zentrale). Die Konsole bringt die
   Werkstatt mit. Lädt nach schale.js. */
"use strict";

S.protokoll = { zeilen: [], letzteNr: 0, filter: "" };

function protokollZeile(stufe, text, quelle = "Oberfläche") {
  S.protokoll.zeilen.push({ zeit: new Date().toISOString(), stufe, quelle, text });
  if (S.protokoll.zeilen.length > 500) S.protokoll.zeilen.splice(0, S.protokoll.zeilen.length - 500);
  const pre = $("#protokoll-log");
  if (pre && protokollPasst(S.protokoll.zeilen.at(-1))) {
    pre.append(document.createTextNode(protokollText(S.protokoll.zeilen.at(-1)) + "\n"));
    pre.scrollTop = pre.scrollHeight;
  }
}

const protokollText = (z) => `${z.zeit.slice(11, 19)} ${z.stufe.padEnd(7)} ${z.quelle}: ${z.text}`;
const protokollPasst = (z) => !S.protokoll.filter || protokollText(z).toLowerCase().includes(S.protokoll.filter);

document.addEventListener("protokoll", (e) => protokollZeile(e.detail.fehler ? "FEHLER" : "INFO", e.detail.text));
document.addEventListener("live", (e) => {
  const d = e.detail;
  if (d && d.job && d.status) protokollZeile("INFO", `Auftrag ${d.job}: ${d.status}`, "Aufträge");
});
window.addEventListener("unhandledrejection", (e) => protokollZeile("FEHLER", String(e.reason && e.reason.message || e.reason)));

UNTEN_ZEICHNER.protokoll = {
  titel: "Protokoll", symbol: "list-ul",
  async zeichne(ziel) {
    const rahmen = el("div", "konsole");
    const pre = el("pre", "konsole__log");
    pre.id = "protokoll-log";
    const zeile = el("div", "konsole__zeile");
    const filter = el("input");
    filter.type = "search";
    filter.placeholder = "Filtern …";
    filter.value = S.protokoll.filter;
    filter.oninput = () => { S.protokoll.filter = filter.value.trim().toLowerCase(); fuellen(); };
    const leeren = knopf("btn btn--ghost", "broom", "");
    leeren.title = "Leeren";
    leeren.onclick = () => { S.protokoll.zeilen = []; fuellen(); };
    zeile.append(filter, leeren);
    rahmen.append(pre, zeile);
    ziel.append(rahmen);
    const fuellen = () => {
      pre.textContent = S.protokoll.zeilen.filter(protokollPasst).map(protokollText).join("\n") + "\n";
      pre.scrollTop = pre.scrollHeight;
    };
    fuellen();
    // Zeilen des Dienstes - nur für die Verwaltung; sonst bleibt es beim Eigenen.
    try {
      const neu = await api(`/api/protokoll?ab=${S.protokoll.letzteNr}`);
      neu.forEach((z) => {
        S.protokoll.letzteNr = Math.max(S.protokoll.letzteNr, z.nr);
        S.protokoll.zeilen.push({ zeit: z.zeit, stufe: z.stufe, quelle: z.quelle, text: z.text });
      });
      S.protokoll.zeilen.sort((a, b) => a.zeit.localeCompare(b.zeit));
      if (neu.length) fuellen();
    } catch (e) { /* 403: kein Dienstprotokoll für diese Person */ }
  },
};

UNTEN_ZEICHNER.auftraege = {
  titel: "Aufträge", symbol: "list-check",
  async zeichne(ziel) {
    let jobs = (S.hub && S.hub.jobs) || null;
    if (!jobs) {
      try { jobs = await api("/api/jobs"); } catch (e) { ziel.append(el("div", "explorer__hinweis", e.message)); return; }
    }
    const tabelle = el("table", "grid");
    const kopf = el("tr");
    ["Status", "Art", "Titel", "Projekt", "Seit"].forEach((t) => kopf.append(el("th", "", t)));
    tabelle.append(kopf);
    jobs.slice(0, 30).forEach((j) => {
      const tr = el("tr");
      tr.append(el("td", "", j.status), el("td", "", j.kind), el("td", "", j.titel),
                el("td", "", j.project || ""), el("td", "", j.created_at ? uhr(j.created_at) : ""));
      tr.style.cursor = "pointer";
      tr.onclick = () => { if (S.hub) S.hub.offen = j; if (ANSICHTEN.includes("agenten")) wechsle("agenten"); };
      tabelle.append(tr);
    });
    if (!jobs.length) ziel.append(el("div", "explorer__hinweis", "Keine Aufträge."));
    ziel.append(tabelle);
  },
};
