// TagAlly Engine — Struktur-Ansicht-Aufruf (Java/PDFBox, siehe
// postprocess/TagAllyView.java). Erzeugt …-struktur.html neben dem PDF.
// Nutzung direkt:  node structview.js /Pfad/zur/Datei.pdf

const { execFile } = require("child_process");
const fs = require("fs");
const path = require("path");
const { javaProps } = require("./i18n.js");

const PP_DIR = path.join(__dirname, "postprocess");

function findJar() {
  if (!fs.existsSync(PP_DIR)) return null;
  const jar = fs.readdirSync(PP_DIR).find((f) => f.startsWith("pdfbox-app") && f.endsWith(".jar"));
  return jar ? path.join(PP_DIR, jar) : null;
}

function structview(pdfFile, lang) {
  return new Promise((resolve, reject) => {
    if (!fs.existsSync(pdfFile)) return reject(new Error("Datei nicht gefunden: " + pdfFile));
    const jar = findJar();
    if (!jar) return reject(new Error("pdfbox-app-*.jar fehlt in engine/postprocess/"));
    if (!fs.existsSync(path.join(PP_DIR, "TagAllyView.class"))) {
      return reject(new Error("TagAllyView.class fehlt — kompilieren mit: javac -cp " + path.basename(jar) + " TagAllyView.java"));
    }
    const output = pdfFile.replace(/\.pdf$/i, "") + "-struktur.html";
    const cp = PP_DIR + path.delimiter + jar;
    // Sprache als .properties durchreichen — EINE Übersetzungsquelle für
    // Node und Java (engine/strings/<sprache>.js).
    const propsFile = output + ".lang.properties";
    fs.writeFileSync(propsFile, javaProps(lang, ["view.", "meta."]), "utf8");
    execFile("java", ["-cp", cp, "TagAllyView", pdfFile, output, propsFile], { maxBuffer: 64 * 1024 * 1024 }, (err, stdout, stderr) => {
      try { fs.unlinkSync(propsFile); } catch (e) { /* Aufräumen optional */ }
      if (err) return reject(new Error("Struktur-Ansicht fehlgeschlagen: " + (stderr || err.message)));
      resolve({ output, log: String(stdout || "").trim().split("\n") });
    });
  });
}

module.exports = { structview };

if (require.main === module) {
  const file = process.argv[2];
  if (!file) {
    console.log("Nutzung: node structview.js /Pfad/zur/Datei.pdf");
    process.exit(2);
  }
  structview(file)
    .then((r) => r.log.forEach((l) => console.log(l)))
    .catch((e) => { console.error("FEHLER: " + e.message); process.exit(2); });
}
