/* Konnektoren: Anbindungen nach außen - Modellanbieter, GitHub, Webhooks.
   Kein eigener Menüpunkt: Karten in den Einstellungen (eigene und je
   Organisation, die man verwaltet), GitHub am Projekt in der Vorgangsliste. */
"use strict";

const KONNEKTOR_ART = { openai: "Modellanbieter", github: "GitHub", webhook: "Webhook" };
const KONNEKTOR_SYMBOL = { openai: "cloud", github: "code-branch", webhook: "bolt" };

/* -- Einstellungen ----------------------------------------------------------- */
document.addEventListener("einstellungen-gezeichnet", async (ev) => {
  if (!S.me.module.konnektoren) return;
  let liste = [];
  try { liste = await api("/api/konnektoren"); } catch (e) { return; }
  const karten = [{ titel: "Konnektoren", org: null, hinweis: "Deine eigenen Anbindungen. "
                    + "Ein eigener Konnektor geht einem der Organisation vor." }];
  S.org.units.filter((u) => u.role === "admin" && u.kind !== "personal").forEach((u) =>
    karten.push({ titel: `Konnektoren für ${u.name}`, org: u, hinweis: "Gelten für alle "
      + "Angehörigen der Einheit und ihrer Untereinheiten." }));
  karten.forEach((k) => {
    const karte = el("div", "karte");
    const kopf = kartenKopf("plug", k.titel);
    const pill = el("span", "pill pill--extern");
    pill.append(ico("cloud-arrow-up"), document.createTextNode(" sendet Daten nach außen"));
    pill.style.marginLeft = "8px";
    kopf.append(pill);
    karte.append(kopf, el("p", "muted", k.hinweis));
    const eintraege = liste.filter((c) => k.org ? c.org_unit_id === k.org.id : c.user_id === S.me.id);
    if (!eintraege.length) karte.append(el("div", "muted", "Noch kein Konnektor."));
    eintraege.forEach((c) => karte.append(konnektorZeile(c)));
    const neu = knopf("btn", "plus", "Konnektor");
    neu.style.marginTop = "10px";
    neu.onclick = () => oeffneKonnektor(null, k.org ? k.org.id : null);
    karte.append(neu);
    ev.detail.ziel.append(karte);
  });
});

function konnektorZeile(c) {
  const z = el("div", "konnektor");
  const art = el("span", "pill");
  art.append(ico(KONNEKTOR_SYMBOL[c.kind] || "plug"), document.createTextNode(" " + (KONNEKTOR_ART[c.kind] || c.kind)));
  z.append(art, el("b", "", c.name));
  if (!c.aktiv) z.append(el("span", "pill", "aus"));
  const ziel = c.kind === "openai" ? c.config.url : c.kind === "webhook" ? c.config.url
    : c.config.token ? "Token " + c.config.token : "";
  z.append(el("span", "muted", ziel || ""), el("span", "spacer"));
  const test = knopf("btn btn--ghost", "stethoscope", "Testen");
  test.onclick = async () => {
    test.disabled = true;
    try {
      const r = await api(`/api/konnektoren/${c.id}/test`, { method: "POST" });
      meldung(r.ok
        ? `${c.name}: Verbindung steht${r.models ? " – Modelle: " + r.models.slice(0, 3).join(", ") : ""}`
          + (r.login ? " – angemeldet als " + r.login : "")
        : `${c.name}: ${r.grund}`, !r.ok);
    } catch (e) { meldung(e.message, true); } finally { test.disabled = false; }
  };
  z.append(test);
  if (c.editierbar) {
    const bearbeiten = knopf("btn btn--ghost", "pen", "");
    bearbeiten.onclick = () => oeffneKonnektor(c, c.org_unit_id);
    z.append(bearbeiten);
  }
  return z;
}

let offenerKonnektor = null;
let konnektorOrg = null;

function konnektorFelder() {
  const art = $("#kn-kind").value;
  $("#kn-openai").hidden = art !== "openai";
  $("#kn-github").hidden = art !== "github";
  $("#kn-webhook").hidden = art !== "webhook";
}

function oeffneKonnektor(c, orgId) {
  offenerKonnektor = c;
  konnektorOrg = orgId || null;
  titelSetzen("#konnektor-titel", "plug", c ? `Konnektor „${c.name}“` : "Neuer Konnektor");
  $("#kn-kind").value = c ? c.kind : "openai";
  $("#kn-kind").disabled = Boolean(c);
  $("#kn-name").value = c ? c.name : "";
  const cfg = (c && c.config) || {};
  $("#kn-url").value = cfg.url && c && c.kind === "openai" ? cfg.url : "";
  $("#kn-key").value = "";
  $("#kn-key").placeholder = cfg.key ? `unverändert (${cfg.key})` : "";
  $("#kn-model").value = cfg.model || "";
  $("#kn-token").value = "";
  $("#kn-token").placeholder = cfg.token ? `unverändert (${cfg.token})` : "";
  $("#kn-whurl").value = c && c.kind === "webhook" ? cfg.url || "" : "";
  $("#kn-secret").value = "";
  $("#kn-secret").placeholder = cfg.secret ? `unverändert (${cfg.secret})` : "";
  document.querySelectorAll("#kn-ereignisse input").forEach((box) => {
    box.checked = c && c.kind === "webhook" ? (cfg.ereignisse || []).includes(box.value) : true;
  });
  $("#kn-aktiv").checked = c ? c.aktiv : true;
  $("#kn-delete").hidden = !c;
  konnektorFelder();
  $("#dlg-konnektor").showModal();
}

document.addEventListener("DOMContentLoaded", () => {
  $("#kn-kind").onchange = konnektorFelder;
  $("#dlg-konnektor form").onsubmit = async (e) => {
    e.preventDefault();
    const art = $("#kn-kind").value;
    const config = art === "openai"
      ? { url: $("#kn-url").value.trim(), key: $("#kn-key").value, model: $("#kn-model").value.trim() }
      : art === "github" ? { token: $("#kn-token").value }
      : { url: $("#kn-whurl").value.trim(), secret: $("#kn-secret").value,
          ereignisse: [...document.querySelectorAll("#kn-ereignisse input:checked")].map((b) => b.value) };
    const koerper = { name: $("#kn-name").value.trim(), config, aktiv: $("#kn-aktiv").checked };
    if (!koerper.name) { meldung("Bitte eine Bezeichnung angeben.", true); return; }
    try {
      if (offenerKonnektor) await jsonRuf(`/api/konnektoren/${offenerKonnektor.id}`, "PATCH", koerper);
      else await jsonRuf("/api/konnektoren", "POST", { ...koerper, kind: art, org_unit_id: konnektorOrg });
      $("#dlg-konnektor").close();
      meldung("Konnektor gespeichert");
      zeichnen();
    } catch (err) { meldung(err.message, true); }
  };
  $("#kn-delete").onclick = async () => {
    if (!offenerKonnektor || !confirm(`Konnektor „${offenerKonnektor.name}“ löschen?`)) return;
    try {
      await api(`/api/konnektoren/${offenerKonnektor.id}`, { method: "DELETE" });
      $("#dlg-konnektor").close();
      zeichnen();
    } catch (err) { meldung(err.message, true); }
  };
});

/* -- GitHub am Projekt --------------------------------------------------------- */
document.addEventListener("liste-gezeichnet", (ev) => {
  if (!S.me.module.konnektoren || !S.daten || !S.daten.project.github_repo) return;
  const { leiste, ziel } = ev.detail;
  const holen = knopf("btn", "code-branch", "GitHub: Issues holen");
  holen.onclick = async () => {
    holen.disabled = true;
    try {
      const r = await api(`/api/projects/${S.pid}/github/issues`, { method: "POST" });
      meldung(`${r.neu} neue Vorgänge, ${r.aktualisiert} nachgeführt`);
      await projektLaden();
      zeichnen();
    } catch (e) { meldung(e.message, true); } finally { holen.disabled = false; }
  };
  leiste.insertBefore(holen, leiste.querySelector(".spacer").nextSibling);
  const karte = el("div", "karte");
  karte.style.marginTop = "16px";
  karte.append(kartenKopf("code-branch", `GitHub: ${S.daten.project.github_repo}`));
  const inhalt = el("div", "muted", "Aktivität wird geladen …");
  karte.append(inhalt);
  ziel.append(karte);
  api(`/api/projects/${S.pid}/github/aktivitaet`).then((a) => {
    inhalt.replaceChildren();
    if (a.pulls.length) {
      inhalt.append(el("label", "", "Offene Pull Requests"));
      a.pulls.forEach((pr) => {
        const z = el("div", "github__zeile");
        const link = el("a", "", `#${pr.number} ${pr.title}`);
        link.href = pr.url; link.target = "_blank"; link.rel = "noopener";
        z.append(link, document.createTextNode(` · ${pr.user}`));
        inhalt.append(z);
      });
    }
    inhalt.append(el("label", "", "Letzte Commits"));
    if (!a.commits.length) inhalt.append(el("div", "muted", "Keine Commits."));
    a.commits.forEach((c) => {
      const z = el("div", "github__zeile");
      const code = el("code", "", c.sha);
      const link = el("a", "", c.message);
      link.href = c.url; link.target = "_blank"; link.rel = "noopener";
      z.append(code, document.createTextNode(" "), link,
               el("span", "muted", ` · ${c.author}${c.date ? " · " + kurzDatum(c.date.slice(0, 10)) : ""}`));
      inhalt.append(z);
    });
  }).catch((e) => { inhalt.textContent = "GitHub: " + e.message; });
});
