# ivc.py

import re

import yaml
from jinja2 import Template

IVC_RE = re.compile(r"```yaml\s+minerai:(.*?)```", re.S | re.I)

def _synth_ivc(minerais: list[dict]) -> str:
    """Crée un tableau de synthèse pour les IVC des minerais."""
    lignes = [
        "| Minerai | IVC | Vulnérabilité |",
        "| :-- | :-- | :-- |"
    ]
    for minerai in minerais:
        lignes.append(
            f"| {minerai['nom']} | {minerai['ivc']} | {minerai['vulnerabilite']} |"
        )
    return "\n".join(lignes)

def _ivc_segments(md: str):
    """Yield (dict, segment) pour chaque bloc IVC yaml."""
    pos = 0
    for m in IVC_RE.finditer(md):
        bloc = yaml.safe_load("minerai:" + m.group(1))
        start = m.end()
        next_match = IVC_RE.search(md, start)
        end = next_match.start() if next_match else len(md)
        yield bloc["minerai"], md[start:end].strip()
        pos = end
    yield None, md[pos:]  # reste éventuel

def build_ivc_sections(md: str) -> str:
    """Fonction principale pour générer les sections dynamiques dans le markdown, spécifiquement dédiée à l'analyse des Indices de Vulnérabilité Complète (IVC).

    La fonction gère :
    - L'extraction et tri des données IVC pour chaque minerai
    - Le formatage des données d'IVC, Vulnérabilité, etc. dans le tableau final
    - La génération du tableau synthétique pour l'analyse globale

    Args:
        md (str): Contenu brut du fichier Markdown contenant les structures YAML à analyser.

    Returns:
        str: Le markdown enrichi avec le tableau de donnée analysé pour l'indice IVC, ou le contenu original inchangé si aucun bloc structuré n'est trouvé.
    """
    segments = []
    minerais = []  # Pour collecter les données de chaque minerai
    intro = None

    matches = list(IVC_RE.finditer(md))
    if matches:
        first = matches[0]
        intro = md[:first.start()].strip()
    else:
        return md  # pas de blocs à traiter

    for m in matches:
        bloc = yaml.safe_load("minerai:" + m.group(1))
        minerais.append(bloc["minerai"])  # Collecte les données
        start = m.end()
        next_match = IVC_RE.search(md, start)
        end = next_match.start() if next_match else len(md)
        rendered = Template(md[start:end].strip()).render(**bloc["minerai"])
        segments.append(rendered)

    if intro:
        segments.insert(0, intro)

    # Créer et insérer le tableau de synthèse
    synth_table = _synth_ivc(minerais)
    md_final = "\n\n".join(segments)

    # Remplacer la section du tableau final
    md_final = re.sub(
        r"## Tableau de synthèse\s*\n<!---- AUTO-BEGIN:TABLEAU-FINAL -->.*?<!---- AUTO-END:TABLEAU-FINAL -->",
        f"## Tableau de synthèse\n<!---- AUTO-BEGIN:TABLEAU-FINAL -->\n{synth_table}\n<!---- AUTO-END:TABLEAU-FINAL -->",
        md_final,
        flags=re.S
    )

    return md_final
