// ======================================================================
// stt.js — Versão FINAL (Corrigida + Estável)
// ======================================================================

// ----------------------------------------------------------------------
// 🔥 FLAG global usada para BLOQUEAR o STT enquanto o TTS fala
// ----------------------------------------------------------------------
window.BLOCK_STT = false;

// ======================================================================
// 1) Normalização de números
// ======================================================================
const NUM_WORDS = {
    // inglês
    "zero":0,"one":1,"two":2,"three":3,"four":4,"five":5,"six":6,
    "seven":7,"eight":8,"nine":9,"ten":10,

    // pt-br
    "um":1,"uma":1,"dois":2,"duas":2,"tres":3,"três":3,"quatro":4,
    "cinco":5,"seis":6,"sete":7,"oito":8,"nove":9,"dez":10,

    // francês
    "un":1,"une":1,"deux":2,"trois":3,"quatre":4,"cinq":5,"six":6,
    "sept":7,"huit":8,"neuf":9,"dix":10,
};

function normalizeNumbers(txt){
    if (!txt) return txt;
    let w = txt.toLowerCase().split(/\s+/);
    for (let i = 0; i < w.length; i++){
        let k = w[i].replace(/[^a-zà-ÿç\-]/gi,"");
        if (NUM_WORDS[k] !== undefined){
            w[i] = NUM_WORDS[k].toString();
        }
    }
    return w.join(" ");
}

// ======================================================================
// 2) Atualização do ícone do microfone
// ======================================================================
// ======================================================================
// Atualização do ícone do microfone + beep confiável
// ======================================================================
function updateMicStatus(isOn) {
    const mic = document.getElementById("micFloating");
    if (!mic) return;

    // pega estado anterior REAL do X
    const xEstavaVisivel = mic.classList.contains("mic-off");

    // aplica novo estado
    mic.classList.toggle("mic-on",  isOn);
    mic.classList.toggle("mic-off", !isOn);

    // 🔥 condição exata: X estava visível e AGORA sumiu
    const xSumiuAgora = isOn && xEstavaVisivel;

    if (xSumiuAgora) {
        console.log("Beep disparado porque o X sumiu agora!");
        try {
            if (window.playCommandBeep) playCommandBeep();
        } catch (e) {
            console.warn("Erro ao tocar beep:", e);
        }
    }
}



// ícone inicia como “desligado”
updateMicStatus(false);

// ======================================================================
// 3) ENGINE STT COMPLETO
// ======================================================================
window.SttEngine = {

    rec: null,
    enabled: false,
    restarting: false,

    lastHeard: 0,
    silenceTimeout: 4500,

    onPartial: null,
    onFinal: null,

    // ----------------------------------------------------------
    // SUPORTE
    // ----------------------------------------------------------
    isSupported(){
        return ("webkitSpeechRecognition" in window ||
                "SpeechRecognition" in window);
    },

    // ----------------------------------------------------------
    // START
    // ----------------------------------------------------------
    start(lang){

        if (!this.isSupported()){
            console.warn("STT não suportado");
            return false;
        }

        if (this.enabled){
            console.warn("STT já estava ativo");
            return true;
        }

        this.enabled = true;
        this.restarting = false;

        const realLang =
            lang ||
            (window.LANGS_BCP ? LANGS_BCP[window.TO] : null) ||
            "fr-FR";

        updateMicStatus(true); // ativa ícone

        this._createRecognition(realLang);
        this._startWatchdog();

        return true;
    },

    // ----------------------------------------------------------
    // CRIAR INSTÂNCIA DO GOOGLE STT
    // ----------------------------------------------------------
    _createRecognition(lang){

        // encerra instância anterior
        if (this.rec){
            try{
                this.rec.onresult = null;
                this.rec.onerror  = null;
                this.rec.onend    = null;
                this.rec.stop();
            }catch(e){}
            this.rec = null;
        }

        const Rec = window.SpeechRecognition || window.webkitSpeechRecognition;
        const rec = new Rec();
        this.rec = rec;

        rec.lang = lang;
        rec.interimResults = true;
        rec.continuous = true;

        this.lastHeard = performance.now();

        // =====================================================
        // onresult → só deixa passar SE BLOCK_STT for false
        // =====================================================
        rec.onresult = (event)=>{

            if (window.BLOCK_STT){
                console.log("STT ignorado (BLOCK_STT ativo)");
                return;
            }

            this.lastHeard = performance.now();

            const results = event.results;
            const last = results[results.length - 1];

            if (last.isFinal){
                const text = normalizeNumbers(last[0].transcript.trim());
                this.onFinal && this.onFinal(text);
            } else {
                const text = normalizeNumbers(last[0].transcript.trim());
                this.onPartial && this.onPartial(text);
            }
        };

        // -----------------------------------------------------
        // ERROR
        // -----------------------------------------------------
        rec.onerror = (err)=>{
            console.warn("STT erro:", err.error);
            this._hardRestart();
        };

        // -----------------------------------------------------
        // ONEND → sempre reinicia
        // -----------------------------------------------------
        rec.onend = ()=>{

            if (!this.enabled) return;

            console.warn("STT terminou → reiniciando");

            // se o TTS estiver falando → espera
            if (window.BLOCK_STT){
                setTimeout(()=> this._hardRestart(), 200);
                return;
            }

            this._hardRestart();
        };

        // -----------------------------------------------------
        // INICIAR
        // -----------------------------------------------------
        try {
            rec.start();
            console.log("STT iniciado:", rec.lang);
        
            // Ícone liga
            updateMicStatus(true);
        
            // 🔥 TOCA BEEP SEMPRE QUE O MICROFONE REALMENTE VOLTA
            try {
                const beep = document.getElementById("beep1");
                if (beep) beep.play();
                else if (window.playCommandBeep) playCommandBeep();
            } catch (e) {
                console.warn("Erro ao tocar beep após reativar STT:", e);
            }
        
        } catch(e){
            console.error("Falha ao iniciar STT:", e);
        }
        
    },

    // ----------------------------------------------------------
    // STOP
    // ----------------------------------------------------------
    stop(){

        if (!this.enabled) return;

        this.enabled = false;

        try{
            if (this.rec){
                this.rec.onresult = null;
                this.rec.onerror = null;
                this.rec.onend = null;
                this.rec.stop();
            }
        }catch(e){}

        updateMicStatus(false);
    },

    // ----------------------------------------------------------
    // WATCHDOG — evita congelamento
    // ----------------------------------------------------------
    _startWatchdog(){
        const loop = () => {
            if (!this.enabled) return;

            const diff = performance.now() - this.lastHeard;

            if (diff > this.silenceTimeout){
                console.warn("STT travou → HARD RESTART");
                this._hardRestart();
                return;
            }
            setTimeout(loop, 500);
        };
        loop();
    },

    // ----------------------------------------------------------
    // HARD RESTART
    // ----------------------------------------------------------
    _hardRestart(){

        if (!this.enabled) return;
        if (this.restarting) return;

        this.restarting = true;

        const langFix =
            (window.LANGS_BCP ? LANGS_BCP[window.TO] : null) ||
            "fr-FR";

        // remove handlers
        try{
            if (this.rec){
                this.rec.onresult = null;
                this.rec.onerror = null;
                this.rec.onend = null;
                this.rec.stop();
            }
        }catch(e){}

        this.rec = null;

        setTimeout(()=>{
            if (!this.enabled) return;
            this.restarting = false;

            console.warn("STT recriando…");
            this._createRecognition(langFix);

        }, 350);
    }
};
