/* SPDX-License-Identifier: AGPL-3.0-only
   SPDX-FileCopyrightText: 2026 Com'Together
   Com'Together — Ma communication. Copyright (C) 2026 Com'Together.
   Programme libre sous AGPL-3.0-only — voir LICENSE. */
/* piper.js — moteur de voix locale Piper (RGPD, local). Chargé À LA DEMANDE.
 * Générique : n'importe quel modèle Piper (SIWIS n'est qu'un modèle parmi
 * d'autres, remplaçable). Le modèle actif vient de state.settings.piperModel.
 * Expose window.PiperTTS = { ok, voice, synth(text,id), install(id,onP),
 *   stored(), remove(id), warm() }.
 */
import * as tts from "./assets/tts/lib/vits-web.js";

const DEFAULT_VOICE = "fr_FR-siwis-medium";
function currentVoice() {
  try { return (window.state && state.settings && state.settings.piperModel) || DEFAULT_VOICE; }
  catch (e) { return DEFAULT_VOICE; }
}
const installing = {};   // promesses de téléchargement par modèle

window.PiperTTS = {
  ok: true,
  get voice() { return currentVoice(); },
  // Installe (télécharge vers OPFS) un modèle, avec progression. NE PAS confondre
  // « moteur Piper » et « voix/modèle » : on installe UNE voix.
  install(id, onProgress) {
    id = id || currentVoice();
    if (!installing[id]) installing[id] = tts.download(id, onProgress).catch(e => { delete installing[id]; throw e; });
    return installing[id];
  },
  warm(onProgress) { return this.install(currentVoice(), onProgress); },
  // Modèles installés localement (OPFS).
  stored() { return tts.stored(); },
  // Supprime les fichiers locaux d'un modèle.
  remove(id) { return tts.remove(id || currentVoice()); },
  // Synthèse : modèle explicite ou modèle actif.
  async synth(text, id) { return await tts.predict({ text, voiceId: id || currentVoice() }); },
};
window.dispatchEvent(new Event("piper-ready"));
