import os
import re

from .config import (
    CORPUS_DIR
)

def strip_prefix(name):
    """Supprime le préfixe numérique éventuel d'un nom de fichier ou de dossier."""
    return re.sub(r'^\d+[-_ ]*', '', name).lower()

def find_prefixed_directory(pattern, base_path=None):
    """
    Recherche un sous-répertoire dont le nom (sans préfixe) correspond au pattern.

    Args:
        pattern: Nom du répertoire sans préfixe
        base_path: Répertoire de base où chercher

    Returns:
        Le chemin relatif du répertoire trouvé (avec préfixe) ou None
    """
    if base_path:
        search_path = os.path.join(CORPUS_DIR, base_path)
    else:
        search_path = CORPUS_DIR

    if not os.path.exists(search_path):
        # print(f"Chemin inexistant: {search_path}")
        return None

    for d in os.listdir(search_path):
        dir_path = os.path.join(search_path, d)
        if os.path.isdir(dir_path) and strip_prefix(d) == pattern.lower():
            return os.path.relpath(dir_path, CORPUS_DIR)

    # print(f"Aucun répertoire correspondant à: '{pattern}' trouvé dans {search_path}")
    return None

def find_corpus_file(pattern, base_path=None):
    """
    Recherche récursive dans le corpus d'un fichier en ignorant les préfixes numériques dans les dossiers et fichiers.

    Args:
        pattern: Chemin relatif type "sous-dossier/nom-fichier"
        base_path: Dossier de base à partir duquel chercher

    Returns:
        Chemin relatif du fichier trouvé ou None
    """

    if base_path:
        search_path = os.path.join(CORPUS_DIR, base_path)
    else:
        search_path = CORPUS_DIR

    # # print(f"Recherche de: '{pattern}' dans {search_path}")

    if not os.path.exists(search_path):
        # print(pattern)
        # print(base_path)
        # print(f"Chemin inexistant: {search_path}")
        return None

    if '/' not in pattern:
        # Recherche directe d'un fichier
        for file in os.listdir(search_path):
            if not file.endswith('.md'):
                continue
            if strip_prefix(os.path.splitext(file)[0]) == pattern.lower():
                rel_path = os.path.relpath(os.path.join(search_path, file), CORPUS_DIR)
                # # print(f"Fichier trouvé: {rel_path}")
                return rel_path
    else:
        # Séparation du chemin en dossier/fichier
        first, rest = pattern.split('/', 1)
        matched_dir = find_prefixed_directory(first, base_path)
        if matched_dir:
            return find_corpus_file(rest, matched_dir)

    # print(f"Aucun fichier correspondant à: '{pattern}' trouvé dans {base_path}.")
    return None


def read_corpus_file(file_path, remove_first_title=False, shift_titles=0):
    """
    Lit un fichier du corpus et applique les transformations demandées.

    Args:
        file_path: Chemin relatif du fichier dans le corpus
        remove_first_title: Si True, supprime la première ligne de titre
        shift_titles: Nombre de niveaux à ajouter aux titres

    Returns:
        Le contenu du fichier avec les transformations appliquées
    """
    full_path = os.path.join(CORPUS_DIR, file_path)

    if not os.path.exists(full_path):
        # print(f"Fichier non trouvé: {full_path}")
        return f"Fichier non trouvé: {file_path}"

    # # print(f"Lecture du fichier: {full_path}")
    with open(full_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()

    # Supprimer la première ligne si c'est un titre et si demandé
    if remove_first_title and lines and lines[0].startswith('#'):
        # # print(f"Suppression du titre: {lines[0].strip()}")
        lines = lines[1:]

    # Décaler les niveaux de titre si demandé
    if shift_titles > 0:
        for i in range(len(lines)):
            if lines[i].startswith('#'):
                lines[i] = '#' * shift_titles + lines[i]

    # Nettoyer les retours à la ligne superflus
    content = ''.join(lines)
    # Supprimer les retours à la ligne en fin de contenu
    content = content.rstrip('\n') + '\n'

    return content

def write_report(report, fichier):
    """Écrit le rapport généré dans le fichier spécifié."""

    report = re.sub(r'<!----.*?-->', '', report)
    report = re.sub(r'\n\n\n+', '\n\n', report)

    with open(fichier, 'w', encoding='utf-8') as f:
        f.write(report)
    # print(f"Rapport généré avec succès: {TEMPLATE_PATH}")
