"""Dictionnaire de prononciation : application + proposition de candidats.

L'application est une simple reecriture de surface du texte (graphie guidee)
avant synthese. Les candidats (noms propres, termes SF) peuvent etre proposes
par Gemma puis valides par l'utilisateur dans l'UI.
"""
from __future__ import annotations

import re
from typing import Iterable

from ..models import Pronunciation, PronunciationEntry
from ..settings import get_settings
from .gemma import Gemma


def apply_pronunciation(text: str, pron: Pronunciation) -> str:
    """Remplace chaque terme actif par sa graphie phonetique (mot entier)."""
    for entry in pron.entries:
        if not entry.enabled or not entry.term:
            continue
        pattern = re.compile(rf"\b{re.escape(entry.term)}\b")
        text = pattern.sub(entry.replacement, text)
    return text


# Le prompt systeme est editable dans les reglages (settings.prompt_pronunciation).


def propose_pronunciations(text: str, gemma: Gemma, *, max_chars: int = 16000) -> list[PronunciationEntry]:
    """Propose des candidats de prononciation a valider."""
    sample = text[:max_chars]
    prompt = (
        "Repere dans cet extrait les mots a risque de mauvaise prononciation par "
        "une voix de synthese francaise. Pour chacun, propose une graphie "
        "phonetique francaise (replacement) qui guide la prononciation.\n\n"
        f"EXTRAIT:\n{sample}\n\n"
        'Reponds par un tableau JSON: '
        '[{"term":"Tiamat","replacement":"Tia-matt","note":"nom propre"}]'
    )
    result = gemma.generate_json(prompt, system=get_settings().prompt_pronunciation)
    entries: list[PronunciationEntry] = []
    for item in result:
        if isinstance(item, dict) and item.get("term") and item.get("replacement"):
            entries.append(PronunciationEntry(
                term=str(item["term"]).strip(),
                replacement=str(item["replacement"]).strip(),
                note=item.get("note"),
            ))
    return entries


def merge_pronunciations(
    existing: Pronunciation, new: Iterable[PronunciationEntry]
) -> Pronunciation:
    by_term = {e.term.lower(): e for e in existing.entries}
    for e in new:
        by_term.setdefault(e.term.lower(), e)
    return Pronunciation(entries=list(by_term.values()))
