/**
 * poi-speech-service.js
 * Kapselt die Sprachausgabe-Logik für POI-Biografien.
 */

let isSpeaking = false;

export function cancelSpeech() {
    isSpeaking = false;
    window.speechSynthesis.cancel();
}

async function getBiographyText(url) {
    try {
        const response = await fetch(url);
        if (!response.ok) throw new Error(`Netzwerk-Antwort war nicht ok: ${response.statusText}`);
        
        const htmlText = await response.text();
        const parser = new DOMParser();
        const doc = parser.parseFromString(htmlText, 'text/html');
        const contentContainer = doc.querySelector('.biography-text .field__item');
        
        return contentContainer ? contentContainer.textContent.trim() : 'Entschuldigung, die Biografie konnte nicht geladen werden.';
    } catch (error) {
        console.error('Fehler beim Abrufen der Biografie:', error);
        return 'Entschuldigung, die Biografie konnte nicht geladen werden.';
    }
}

async function speakChunks(text, lang) {
    if (isSpeaking) return;
    isSpeaking = true;
    
    const sentences = text.split(/(?<=[.?!;])\s*/);

    for (const sentence of sentences) {
        if (!isSpeaking) break;
        if (sentence.trim() === '') continue;

        await new Promise(resolve => {
            const utterance = new SpeechSynthesisUtterance(sentence.trim());
            utterance.lang = lang;
            utterance.onerror = () => resolve();
            utterance.onend = () => resolve();
            window.speechSynthesis.speak(utterance);
        });
    }
    isSpeaking = false;
}

/**
 * Die Hauptfunktion, die vom Coordinator aufgerufen wird.
 */
export async function handleReadBiography(biographyUrl) {
    cancelSpeech();
    
    // Kleiner Trick für Mobile-Browser: Leere Instanz triggern
    window.speechSynthesis.speak(new SpeechSynthesisUtterance(""));

    if (!('speechSynthesis' in window)) {
        alert("Sprachausgabe wird von Ihrem Browser nicht unterstützt.");
        return;
    }

    try {
        const text = await getBiographyText(biographyUrl);
        const cleanedText = text.replace(/<[^>]*>?/gm, '');

        const voices = window.speechSynthesis.getVoices();
        const germanVoices = voices.filter(voice => voice.lang.includes('de'));

        if (germanVoices.length === 0) {
            alert("Deutsche Sprachausgabe ist auf Ihrem Gerät nicht verfügbar.");
            return;
        }

        await speakChunks(cleanedText, 'de-DE');
    } catch (error) {
        console.error("Fehler im Speech-Ablauf:", error);
    }
}