#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import re
import sys
from collections import defaultdict

def extract_paths(file_path):
    """Extrait tous les chemins du fichier rapport_template.md"""
    paths = []
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line in f:
                # Extraire les lignes qui commencent par "Corpus/"
                if line.strip().startswith("Corpus/"):
                    paths.append(line.strip())
    except Exception as e:
        print(f"Erreur lors de la lecture du fichier {file_path}: {e}")
        sys.exit(1)
    
    return paths

def check_paths(paths, base_dir):
    """Vérifie si les chemins existent dans le système de fichiers"""
    results = {
        "existing": [],
        "missing": [],
        "problematic": []  # Chemins qui pourraient nécessiter des corrections
    }
    
    for path in paths:
        # Vérifier si le chemin est absolu ou relatif
        abs_path = os.path.join(base_dir, path)
        
        if os.path.exists(abs_path):
            results["existing"].append(path)
        else:
            # Essayer de détecter des problèmes potentiels
            problem_detected = False
            
            # Vérifier les chemins avec "Fiche minerai" ou "Fiche fabrication"
            if "Fiche minerai" in path or "Fiche fabrication" in path:
                # Problème courant: mauvaise casse ou absence du mot "minerai"
                path_lower = path.lower()
                if "minerai" not in path_lower and "/minerai/" in path_lower:
                    corrected_path = path.replace("/Fiche ", "/Fiche minerai ")
                    if os.path.exists(os.path.join(base_dir, corrected_path)):
                        results["problematic"].append((path, corrected_path, "Mot 'minerai' manquant"))
                        problem_detected = True
            
            # Vérifier les chemins SSD
            if "SSD25" in path:
                corrected_path = path.replace("SSD25", "SSD 2.5")
                if os.path.exists(os.path.join(base_dir, corrected_path)):
                    results["problematic"].append((path, corrected_path, "Format 'SSD25' au lieu de 'SSD 2.5'"))
                    problem_detected = True
            
            # Si aucun problème spécifique n'a été détecté, marquer comme manquant
            if not problem_detected:
                results["missing"].append(path)
    
    return results

def find_similar_paths(missing_path, base_dir):
    """Essaie de trouver des chemins similaires pour aider à diagnostiquer le problème"""
    missing_parts = missing_path.split('/')
    similar_paths = []
    
    # Rechercher dans les sous-répertoires correspondants
    search_dir = os.path.join(base_dir, *missing_parts[:-1])
    if os.path.exists(search_dir):
        for file in os.listdir(search_dir):
            if file.endswith('.md'):
                similar_path = os.path.join(search_dir, file).replace(base_dir + '/', '')
                similar_paths.append(similar_path)
    
    # Si aucun chemin similaire n'est trouvé, remonter d'un niveau
    if not similar_paths and len(missing_parts) > 2:
        parent_dir = os.path.join(base_dir, *missing_parts[:-2])
        if os.path.exists(parent_dir):
            for dir_name in os.listdir(parent_dir):
                if dir_name.lower() in missing_parts[-2].lower():
                    dir_path = os.path.join(parent_dir, dir_name)
                    if os.path.isdir(dir_path):
                        for file in os.listdir(dir_path):
                            if file.endswith('.md'):
                                similar_path = os.path.join(dir_path, file).replace(base_dir + '/', '')
                                similar_paths.append(similar_path)
    
    return similar_paths

def main():
    # Vérifier que nous sommes dans le bon répertoire
    script_dir = os.path.dirname(os.path.abspath(__file__))
    base_dir = script_dir
    
    # Chemin vers le rapport_template.md
    template_path = os.path.join(base_dir, "Corpus", "rapport_template.md")
    
    if not os.path.exists(template_path):
        print(f"Erreur: Le fichier {template_path} n'existe pas.")
        sys.exit(1)
    
    print("=== Vérification des chemins dans rapport_template.md ===")
    
    # Extraire les chemins
    paths = extract_paths(template_path)
    print(f"Nombre total de chemins trouvés: {len(paths)}")
    
    # Vérifier les chemins
    results = check_paths(paths, base_dir)
    
    # Afficher les résultats
    print("\n=== Résultats ===")
    print(f"Chemins existants: {len(results['existing'])}")
    print(f"Chemins manquants: {len(results['missing'])}")
    print(f"Chemins problématiques: {len(results['problematic'])}")
    
    # Afficher les chemins manquants
    if results["missing"]:
        print("\n=== Chemins manquants ===")
        for path in results["missing"]:
            print(f"- {path}")
            similar = find_similar_paths(path, base_dir)
            if similar:
                print("  Chemins similaires trouvés:")
                for sim_path in similar[:3]:  # Limiter à 3 suggestions
                    print(f"  * {sim_path}")
    
    # Afficher les chemins problématiques avec suggestions
    if results["problematic"]:
        print("\n=== Chemins problématiques ===")
        for orig, corrected, reason in results["problematic"]:
            print(f"- {orig}")
            print(f"  Suggestion: {corrected}")
            print(f"  Raison: {reason}")
    
    # Résumé
    if not results["missing"] and not results["problematic"]:
        print("\nTous les chemins dans le rapport sont valides !")
    else:
        print("\nDes chemins problématiques ont été détectés. Veuillez corriger les erreurs.")

if __name__ == "__main__":
    main()