// Processus ouvrier : c'est ici, et nulle part ailleurs, que les pixels sont
// manipulés. Si une image fait tomber le décodeur natif, seul ce processus
// meurt — le serveur, lui, reste debout et signale l'échec proprement.

import path from 'node:path';
import { writeFile } from 'node:fs/promises';
import { traiter } from './traitement.mjs';

// Si le serveur disparaît — fenêtre fermée, arrêt brutal — le canal de
// communication se rompt : l'ouvrier s'arrête plutôt que de rester orphelin.
process.on('disconnect', () => process.exit(0));

process.on('message', async (tache) => {
  try {
    const resultat = await traiter({ chemin: tache.chemin }, tache.options);

    const plusieurs = resultat.sorties.length > 1;
    const fichiers = [];

    for (const sortie of resultat.sorties) {
      const suffixe = plusieurs ? `-${sortie.largeur}w` : '';
      const nom = `${tache.base}${suffixe}${resultat.extension}`;
      const complet = path.join(tache.dossierSortie, nom);
      await writeFile(complet, sortie.octets);
      fichiers.push({
        nom, chemin: complet,
        largeur: sortie.largeur, hauteur: sortie.hauteur,
        taille: sortie.taille, qualite: sortie.qualite, budgetTenu: sortie.budgetTenu,
      });
    }

    process.send({
      ok: true,
      avant: resultat.avant,
      transparente: resultat.transparente,
      alphaConservee: resultat.alphaConservee,
      decodeurSecours: resultat.decodeurSecours,
      apercuAvant: resultat.apercuAvant,
      apercuApres: resultat.apercuApres,
      fichiers,
    });
  } catch (e) {
    process.send({ ok: false, erreur: e.message });
  }
});
