###
# prend le fichier personnages.org, détermine les noms des personnages selon les entêtes orgmode, et va ensuite lire le fichier livre.org et parcourir ses entêtes qui sont les chapitres du livre.
# générer un fichier csv qui listera les chapitres et les personnages en colonnes, pour compter 1 à chaque chapitre lorsque le nom du personnage est retrouvé dedans
# les personnages que l'on recherche dans le livre ne sont pas mentionnés dans la ligne d'entête; mais dans les lignes entre deux entêtes, dans les corps de texte
###
import csv
import re
import argparse
import os

# Ajouter un argument pour le chemin du dossier contenant le fichier livre.org
parser = argparse.ArgumentParser(description='Rechercher les occurrences de personnages dans un fichier Org-mode.')
parser.add_argument('dossier', nargs='?', help='Le chemin du dossier contenant le fichier livre.org. Si aucun dossier n\'est spécifié, le dossier courant sera utilisé.', default=os.getcwd())
args = parser.parse_args()

# Concaténer le chemin du dossier et le nom du fichier livre.org
fichier_livre = f"{args.dossier}/livre.org"

# Remplacer par les chemins vers les fichiers Org-mode
fichier_personnages = f"{args.dossier}/personnages.org"

# Expressions régulières pour extraire les noms des personnages, les alias et les titres des chapitres
regex_personnage = r"\*\* (.*)"
regex_alias = r"\s*- alias:\s*(.*?)\s*$"
regex_chapitre = r'\*\* (.+)'

# Dictionnaire pour stocker les occurrences de personnages dans chaque chapitre
occurrences_personnages = {}
alias_separator=";"

def extract_character_info(character_line):
    match = re.search(regex_personnage, character_line)
    if match:
        character = match.group(1)
        aliases = []

        # Extraire les alias du caractère
        match_alias = re.search(regex_alias, character_line)
        if match_alias:
            aliases = [alias.strip() for alias in match_alias.group(1).split(alias_separator)]
            print("aliases", aliases)

        return character, aliases

    return None, []

# Ouvrir le fichier personnages.org et extraire les noms des personnages et leurs alias

def contains_any_of_these_words(line: str, words: list[str]) -> bool:
    for word in words:
        if word in line:
            return True
    return False
with open(fichier_personnages, 'r', encoding='utf-8') as fichier_personnages:
    personnages = {}
    for ligne in fichier_personnages:
        character, aliases = extract_character_info(ligne)
        if character:
            personnages[character] = aliases

print('personnages: ', personnages.keys())

# Ouvrir le fichier livre.org et le fichier CSV
with open(fichier_livre, 'r', encoding='utf-8') as livre, open(f"{args.dossier}/occurrences_personnages.csv", 'w', newline='', encoding='utf-8') as fichier_csv:
    content = livre.read()
    csv_writer = csv.writer(fichier_csv)

    # Écrire les en-têtes dans le fichier CSV
    csv_writer.writerow(['Chapitre'] + list(personnages.keys()))
    occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()}
    chapitre = '(chapitre not found)'

    # Parcourir chaque ligne du fichier livre.org
    for ligne in content.strip().split("\n"):
    # Rechercher le titre du chapitre
        match_chapitre = re.search(regex_chapitre, ligne)
        if match_chapitre:
            chapitre = match_chapitre.group(1)
            chapitre = re.sub( ":title:", "", chapitre)
            print(chapitre)
            # Initialiser le dictionnaire d'occurrences pour chaque chapitre
            occurrences_chapitre = {personnage: 0 for personnage in personnages.keys()}

        # Parcourir chaque personnage et rechercher son nom ou ses alias dans la ligne
        for personnage, aliases in personnages.items():
                if personnage.lower() in ligne.lower() or any(alias.lower() in ligne.lower() for alias in aliases):
                    occurrences_chapitre[personnage] += 1
#                     print(personnage, ':', alias, ' : ', ligne)
#                     print(chapitre,' - ',personnage,' : ', ligne)
        # Ajouter les occurrences du chapitre au dictionnaire global
        occurrences_personnages[chapitre] = occurrences_chapitre

    # Écrire les occurrences des personnages dans le fichier CSV
    for chapitre, occurrences in occurrences_personnages.items():
        csv_writer.writerow([chapitre] + [occurrences[personnage] for personnage in personnages.keys()])

