#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script pour remplacer les références de chemins dans le rapport par le contenu des fichiers.
Ajuste automatiquement les niveaux de titres pour maintenir la hiérarchie.
"""

import os
import re
from pathlib import Path

# Chemins de base
BASE_DIR = Path(__file__).resolve().parent
BASE_DIR = BASE_DIR / ".."
CORPUS_DIR = BASE_DIR / "Corpus"
INPUT_PATH = CORPUS_DIR / "rapport_template.md"
OUTPUT_PATH = CORPUS_DIR / "rapport_final.md"

def determine_heading_level(line):
    """Détermine le niveau de titre d'une ligne."""
    match = re.match(r'^(#+)\s+', line)
    if match:
        return len(match.group(1))
    return 0

def determine_parent_level(lines, current_index):
    """Détermine le niveau de titre parent pour une ligne donnée."""
    # Remonter dans les lignes précédentes pour trouver le titre parent
    for i in range(current_index - 1, -1, -1):
        level = determine_heading_level(lines[i])
        if level > 0:
            return level
    return 0

def adjust_heading_levels(content, parent_level, is_intro_file=False, is_ivc_section=False):
    """Ajuste les niveaux de titres dans le contenu pour s'adapter à la hiérarchie."""
    lines = content.split('\n')

    # Si le contenu est vide, retourner une chaîne vide
    if not lines:
        return ""

    # Déterminer le niveau minimum de titre dans le contenu original
    min_level = 10
    for line in lines:
        level = determine_heading_level(line)
        if level > 0 and level < min_level:
            min_level = level

    # Si aucun titre trouvé, simplement supprimer la première ligne si nécessaire
    if min_level == 10:
        if not is_intro_file and not is_ivc_section and lines:
            return '\n'.join(lines[1:])
        return content

    # Traitement spécial pour les fichiers IVC et intro
    if is_ivc_section or is_intro_file:
        adjusted_lines = []
        # Pour les fichiers IVC ou intro, on garde toutes les lignes mais on ajuste les niveaux des titres
        for line in lines:
            level = determine_heading_level(line)
            if level > 0:
                # Nouveau niveau = niveau parent + 1 + (niveau actuel - min_level)
                new_level = parent_level + 1 + (level - min_level)
                # S'assurer que le niveau ne dépasse pas 6 (limite en markdown)
                new_level = min(new_level, 6)
                line = re.sub(r'^#+\s+', '#' * new_level + ' ', line)
            adjusted_lines.append(line)
    else:
        # Pour les fichiers standards, on supprime la première ligne
        lines = lines[1:]
        adjusted_lines = []
        # Ajuster les niveaux de titres pour les lignes restantes
        for line in lines:
            level = determine_heading_level(line)
            if level > 0:
                # Nouveau niveau = niveau parent + 1 + (niveau actuel - min_level)
                new_level = parent_level + 1 + (level - min_level)
                # S'assurer que le niveau ne dépasse pas 6 (limite en markdown)
                new_level = min(new_level, 6)
                line = re.sub(r'^#+\s+', '#' * new_level + ' ', line)
            adjusted_lines.append(line)

    return '\n'.join(adjusted_lines)

def process_report():
    """Traite le rapport pour remplacer les chemins par le contenu."""
    if not os.path.exists(INPUT_PATH):
        print(f"Fichier d'entrée introuvable: {INPUT_PATH}")
        return

    # Lire le rapport
    with open(INPUT_PATH, 'r', encoding='utf-8') as f:
        lines = f.readlines()

    output_lines = []
    i = 0
    while i < len(lines):
        line = lines[i].strip()

        # Vérifier si la ligne est un chemin
        if line.startswith('Corpus/'):
            path = line
            full_path = BASE_DIR / path

            # Déterminer le niveau de titre parent
            parent_level = determine_parent_level(lines, i)

            try:
                # Lire le contenu du fichier
                if os.path.exists(full_path):
                    # Vérifier si c'est un fichier _intro.md
                    is_intro_file = os.path.basename(full_path) == "_intro.md"

                    # Vérifier si c'est une section d'Indice de Vulnérabilité de Concurrence
                    is_ivc_section = "Vulnérabilité de Concurrence" in line or "/ivc-" in path.lower() or "/fiche technique ivc/" in path.lower()

                    with open(full_path, 'r', encoding='utf-8') as f:
                        content = f.read()

                    # Ajuster les niveaux de titres
                    adjusted_content = adjust_heading_levels(content, parent_level, is_intro_file, is_ivc_section)

                    # Ajouter le contenu ajusté
                    output_lines.append(f"<!-- Contenu du fichier {path} -->")
                    output_lines.append(adjusted_content)
                    output_lines.append(f"<!-- Fin du contenu de {path} -->")
                else:
                    output_lines.append(f"<!-- Fichier non trouvé: {path} -->")
                    output_lines.append(line)
            except Exception as e:
                output_lines.append(f"<!-- Erreur lors de la lecture du fichier {path}: {str(e)} -->")
                output_lines.append(line)
        else:
            # Conserver la ligne telle quelle
            output_lines.append(line)

        i += 1

    # Écrire le rapport final
    with open(OUTPUT_PATH, 'w', encoding='utf-8') as f:
        f.write('\n'.join(output_lines))

    print(f"Rapport final généré: {OUTPUT_PATH}")

if __name__ == "__main__":
    process_report()
