// TagAlly Engine — Post-Processing-Aufruf (Java/PDFBox, siehe postprocess/TagAllyFix.java).
// Nutzung direkt:  node postprocess.js /Pfad/zur/Datei.pdf   → erzeugt …-ua.pdf daneben.

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 postprocess(pdfFile, langs, 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, "TagAllyFix.class"))) {
      return reject(new Error("TagAllyFix.class fehlt — kompilieren mit: javac -cp " + path.basename(jar) + " TagAllyFix.java"));
    }
    const output = pdfFile.replace(/\.pdf$/i, "") + "-ua.pdf";
    const cp = PP_DIR + path.delimiter + jar;
    const jargs = ["-cp", cp, "TagAllyFix", pdfFile, output];
    // Sprach-Injektion (Fix 10): fremdsprachige Absätze als TSV-Datei mitgeben.
    let langFile = null;
    if (Array.isArray(langs) && langs.length) {
      const lines = langs
        .filter((e) => e && e.lang && e.text)
        .map((e) => String(e.lang).trim() + "\t" + String(e.text).replace(/[\u0000-\u001F\u2028\u2029]/g, " "));
      if (lines.length) {
        langFile = output + ".langs.tsv";
        fs.writeFileSync(langFile, lines.join("\n") + "\n", "utf8");
        jargs.push(langFile);
      }
    }
    // Meldungssprache als .properties durchreichen (Position 4 — die
    // TSV-Position davor muss belegt sein, notfalls als Leerstring).
    const propsFile = output + ".lang.properties";
    fs.writeFileSync(propsFile, javaProps(lang, ["fix."]), "utf8");
    if (jargs.length === 5) jargs.push(""); // kein TSV → Platzhalter
    jargs.push(propsFile);
    execFile("java", jargs, { maxBuffer: 16 * 1024 * 1024 }, (err, stdout, stderr) => {
      try { fs.unlinkSync(propsFile); } catch (e) { /* Aufräumen optional */ }
      if (langFile) { try { fs.unlinkSync(langFile); } catch (e) { /* Aufräumen optional */ } }
      if (err) return reject(new Error("Post-Processing fehlgeschlagen: " + (stderr || err.message)));
      resolve({ output, log: String(stdout || "").trim().split("\n") });
    });
  });
}

module.exports = { postprocess };

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