/* Befehlspalette wie in VS Code: Strg+Umschalt+P oder Strg+K zeigen Befehle
   und Ansichten, Strg+P die Dateien, die der Explorer kennt. Ein Dialog, ein
   Filter nach Teilfolge (jeder Buchstabe in Reihenfolge), Pfeile und Enter.
   Quellen: die Manifeste (BEITRAEGE.befehle, .ansichten) und BEFEHLE. */
"use strict";

S.palette = { modus: ">", eintraege: [], gefiltert: [], stelle: 0 };

function paletteEintraege(modus) {
  if (modus === ">") {
    const liste = [];
    BEITRAEGE.ansichten.forEach((a) => liste.push({
      titel: `Ansicht: ${a.titel}`, symbol: a.symbol, tue: () => wechsle(a.id) }));
    BEITRAEGE.befehle.forEach((b) => {
      if (BEFEHLE[b.id] && (!b.nur_desktop || (S.me && S.me.befehle))) {
        liste.push({ titel: b.titel, symbol: "bolt", taste: b.taste, tue: BEFEHLE[b.id] });
      }
    });
    liste.push({ titel: "Seitenleiste ein/aus", symbol: "table-columns", taste: "Ctrl+B", tue: () => panelUmschalten() },
                { titel: "Untere Leiste ein/aus", symbol: "terminal", taste: "Ctrl+J", tue: () => untenUmschalten() },
                { titel: "Assistent ein/aus", symbol: "robot", tue: () => assistentUmschalten() },
                { titel: "Reiter schließen", symbol: "xmark", tue: () => S.tabs.aktiv && schliesseTab(S.tabs.aktiv.id) });
    Object.entries(UNTEN_ZEICHNER).forEach(([id, r]) => {
      if (untenSichtbar(id)) liste.push({ titel: `Leiste: ${r.titel}`, symbol: r.symbol, tue: () => untenTab(id) });
    });
    return liste;
  }
  const dateien = typeof dateiListe === "function" && S.pid ? dateiListe() : [];
  return dateien.map((p) => ({ titel: p, symbol: dateiSymbol("", p), tue: () => oeffneDatei(p) }));
}

/** Teilfolge: „gnt“ trifft „Gantt“ - wie in VS Code, ohne Gewichtung. */
function palettePasst(frage, text) {
  const t = text.toLowerCase();
  let i = 0;
  for (const z of frage.toLowerCase()) {
    i = t.indexOf(z, i);
    if (i < 0) return false;
    i += 1;
  }
  return true;
}

function paletteOeffnen(modus = ">") {
  const dlg = $("#dlg-palette");
  const feld = $("#pal-feld");
  S.palette.modus = modus;
  S.palette.eintraege = paletteEintraege(modus);
  feld.value = modus;
  feld.placeholder = modus === ">" ? "Befehl oder Ansicht …" : "Datei öffnen …";
  if (!dlg.open) dlg.showModal();
  feld.focus();
  feld.setSelectionRange(feld.value.length, feld.value.length);
  paletteFiltern();
}

function paletteFiltern() {
  const feld = $("#pal-feld");
  let text = feld.value;
  // Der Modus hängt am ersten Zeichen, wie in VS Code: ">" Befehle, sonst Dateien.
  const modus = text.startsWith(">") ? ">" : "";
  if (modus !== S.palette.modus) {
    S.palette.modus = modus;
    S.palette.eintraege = paletteEintraege(modus);
  }
  text = modus === ">" ? text.slice(1).trim() : text.trim();
  S.palette.gefiltert = S.palette.eintraege.filter((e) => !text || palettePasst(text, e.titel)).slice(0, 40);
  S.palette.stelle = 0;
  paletteZeichnen();
}

function paletteZeichnen() {
  const liste = $("#pal-liste");
  liste.replaceChildren();
  if (!S.palette.gefiltert.length) {
    liste.append(el("div", "palette__leer", S.palette.modus === ">" ? "Kein Befehl passt." : "Keine Datei bekannt - erst im Explorer Ordner aufklappen."));
    return;
  }
  S.palette.gefiltert.forEach((e, i) => {
    const z = el("div", "palette__eintrag" + (i === S.palette.stelle ? " is-active" : ""));
    z.setAttribute("role", "option");
    z.append(ico(e.symbol || "circle"), el("span", "palette__titel", e.titel));
    if (e.taste) z.append(el("kbd", "", e.taste.replace("Ctrl", navigator.platform.includes("Mac") ? "⌘" : "Strg")));
    z.onmousedown = (ev) => { ev.preventDefault(); S.palette.stelle = i; paletteAusfuehren(); };
    liste.append(z);
  });
  const aktiv = liste.children[S.palette.stelle];
  if (aktiv) aktiv.scrollIntoView({ block: "nearest" });
}

function paletteAusfuehren() {
  const e = S.palette.gefiltert[S.palette.stelle];
  $("#dlg-palette").close();
  if (e) e.tue();
}

document.addEventListener("DOMContentLoaded", () => {
  const dlg = $("#dlg-palette");
  const feld = $("#pal-feld");
  feld.oninput = paletteFiltern;
  feld.onkeydown = (e) => {
    if (e.key === "ArrowDown" || e.key === "ArrowUp") {
      e.preventDefault();
      const n = S.palette.gefiltert.length;
      if (n) S.palette.stelle = (S.palette.stelle + (e.key === "ArrowDown" ? 1 : n - 1)) % n;
      paletteZeichnen();
    }
  };
  $("form", dlg).onsubmit = (e) => { e.preventDefault(); paletteAusfuehren(); };
  dlg.onclick = (e) => { if (e.target === dlg) dlg.close(); };   // Klick daneben schließt
});
