// ======================================================
// tts.js — versão FINAL LIMPA e CORRETA
// Sincronizada com stt.js
// ======================================================

(function () {

  // --------------------------------------------------
  // Namespace público do TTS
  // --------------------------------------------------
  const TtsEngine = {};
  window.TtsEngine = TtsEngine;

  // --------------------------------------------------
  // Estado interno
  // --------------------------------------------------
  let VOICES = [];   // lista de vozes carregadas pelo browser
  let READY  = false; // indica se as vozes já estão disponíveis

  // --------------------------------------------------
  // Mapeamento de idiomas curtos → BCP-47
  // --------------------------------------------------
  const LANG_MAP = {
    fr:   "fr-FR",
    it:   "it-IT",
    es:   "es-ES",
    en:   "en-US",
    ptbr: "pt-BR",
    pt:   "pt-PT",
    ptpt: "pt-PT",
    de:   "de-DE",
    zh:   "zh-CN",
    ko:   "ko-KR",
    ja:   "ja-JP",
    ar:   "ar-SA",
    br:   "pt-BR" // compatibilidade antiga
  };

  // --------------------------------------------------
  // Carrega vozes do SpeechSynthesis
  // --------------------------------------------------
  function loadVoices() {
    // obtém todas as vozes disponíveis no navegador
    VOICES = speechSynthesis.getVoices();

    // marca como pronto se houver pelo menos uma voz
    READY = VOICES.length > 0;
  }

  // primeira tentativa imediata
  loadVoices();

  // alguns navegadores carregam as vozes de forma assíncrona
  speechSynthesis.onvoiceschanged = loadVoices;

  // --------------------------------------------------
  // Seleciona a melhor voz para o idioma solicitado
  // --------------------------------------------------
  function pickVoice(shortLang) {
    // se as vozes ainda não carregaram, não tenta escolher
    if (!READY) return null;

    const tgt = shortLang.toLowerCase();

    // 1) tenta correspondência direta no início (ex: fr → fr-FR)
    return (
      VOICES.find(v => v.lang.toLowerCase().startsWith(tgt)) ||
      // 2) tenta correspondência parcial
      VOICES.find(v => v.lang.toLowerCase().includes(tgt)) ||
      // 3) se não achar, deixa o browser decidir
      null
    );
  }

  // ======================================================
  // FUNÇÃO PRINCIPAL: FALA + CONTROLE TOTAL DO STT
  // ======================================================
  TtsEngine.speak = function (text, opts = {}) {
    return new Promise(resolve => {

      // --------------------------------------------------
      // Se não houver texto, encerra imediatamente
      // --------------------------------------------------
      if (!text) {
        resolve();
        return;
      }

      // --------------------------------------------------
      // Determina idioma e parâmetros
      // --------------------------------------------------
      // idioma curto (ex: "fr" vindo de "fr-FR")
      const short = (opts.langTag || "fr").split("-")[0];

      // idioma completo BCP-47
      const langTag = LANG_MAP[short] || opts.langTag || "fr-FR";

      // velocidade da fala
      const rate = opts.rate || 1;

      // --------------------------------------------------
      // Verifica se o STT estava ativo antes do TTS
      // --------------------------------------------------
      const sttWasOn = window.SttEngine?.enabled === true;

      // --------------------------------------------------
      // 1) BLOQUEIA STT ANTES DE FALAR
      // --------------------------------------------------
      // flag global para impedir que o STT capture a própria voz
      window.BLOCK_STT = true;

      // se o STT estava ligado, interrompe imediatamente
      if (sttWasOn) {
        try {
          window.SttEngine.stop();
        } catch (e) {}
      }

      // atualiza visualmente o ícone do microfone
      updateMicStatus(false);

      // cancela qualquer fala pendente
      speechSynthesis.cancel();

      // --------------------------------------------------
      // 2) CRIA O UTTERANCE (OBJETO DE FALA)
      // --------------------------------------------------
      const u = new SpeechSynthesisUtterance(text);

      // define idioma da fala
      u.lang = langTag;

      // define velocidade
      u.rate = rate;

      // escolhe a melhor voz disponível
      const voice = pickVoice(short);
      if (voice) {
        u.voice = voice;
      }

      // --------------------------------------------------
      // 3) FUNÇÃO DE RESTAURAÇÃO DO MICROFONE / STT
      // --------------------------------------------------
      function restoreMic() {

        // libera o STT novamente
        window.BLOCK_STT = false;

        // se o STT estava ligado antes do TTS, religa
        if (sttWasOn) {
          try {
            // idioma correto para o STT (prioriza configuração global)
            const langForStt =
              window.LANGS_BCP?.[window.TO] || langTag;

            window.SttEngine.start(langForStt);

            // pequeno atraso para garantir inicialização do microfone
            setTimeout(() => {
              updateMicStatus(true);
            }, 120);

          } catch (e) {}
        }

        // resolve a Promise do speak()
        resolve();
      }

      // --------------------------------------------------
      // 4) EVENTOS DO TTS
      // --------------------------------------------------
      // quando a fala termina normalmente
      u.onend = () => {
        setTimeout(restoreMic, 200);
      };

      // se ocorrer erro na fala
      u.onerror = () => {
        setTimeout(restoreMic, 200);
      };

      // --------------------------------------------------
      // 5) DISPARA A FALA
      // --------------------------------------------------
      speechSynthesis.speak(u);
    });
  };

})();
