import re
from collections import defaultdict


regex_chapitre = r'\*\* (.+)'
fichier_livre = 'livre.org'

# Ouvrir le fichier livre.org
with open("livre.org", "r") as livre:
    content = livre.read()

# Définir la fonction pour séparer les mots d'une ligne
def split_words(line):
    return re.split('[\s]+', line)

# Initialisation du dictionnaire pour stocker le nombre de mots par chapitre
chapters_word_count = defaultdict(int)

# Parcours des lignes du fichier
# Parcourir chaque ligne du fichier livre.org
chapitre = '(chapitre not found)'
for ligne in content.strip().split("\n"):
    # Rechercher le titre du chapitre
    match_chapitre = re.search(regex_chapitre, ligne)
    if match_chapitre:
        chapitre = re.sub( ":title:", "", match_chapitre.group(1))
        print(chapitre)
    words = split_words(ligne)
    chapters_word_count[chapitre] += len(words)


def draw_progress_bar(percent: float, target: int) -> str:
    # Calcul du nombre total de caractères nécessaire pour représenter 100%
    max_length = len("█") * (target / 100)

    # Calcul de la longueur de la barre de progression
    length = int((max_length * percent) // 100)

    # Création de la chaîne représentant la barre de progression
    progress_bar = "[" + ("█" * int(length)) + ("_" * (int(max_length) - int(length))) + "]"

    # Affichage de la barre de progression
#     print(f"\rProgression : {percent}%, {progress_bar}", end="\r")

    return progress_bar

objectif_mots=500
sum_mots=0
# Afficher le résultat
print("Nombre de mots par chapitre : ")
count_chapitres=0
def nombre_de_pages(nombre_de_mots):
    return round(nombre_de_mots / 250)
def format_with_spaces(n):
    return '{:,}'.format(n).replace(',', ' ')
def genre_de_livre(nombre_de_mots):
    if nombre_de_mots < 5000:
        return "Nouvelle"
    elif 5000 <= nombre_de_mots < 30000:
        return "Récit"
    elif 30000 <= nombre_de_mots < 50000:
        return "Nouvelles"
    elif 50000 <= nombre_de_mots < 100000:
        return "Roman court"
    elif 100000 <= nombre_de_mots < 200000:
        return "Roman"
    elif 200000 <= nombre_de_mots < 500000:
        return "Roman épais"
    else:
        return "Autre"


# temps de lecture en minutes
def temps_de_lecture(nombre_de_signes):
    return round(nombre_de_signes / 80 * 60)

def temps_de_redaction(nombre_de_signes, mots_par_minute):
    return round(nombre_de_signes / mots_par_minute * 60)

def format_time(seconds):
    minutes, seconds = divmod(seconds, 60)
    hours, minutes = divmod(minutes, 60)
    return "{:02d} heures {:02d} minutes {:02d} secondes.".format(hours, minutes, seconds)

for count, value in sorted(chapters_word_count.items(), key=lambda item: item[0]):
    sum_mots+=value
    count_chapitres+=1
    print(f"{value} mots \t\t \t{count} \t\t{draw_progress_bar(value, objectif_mots)}  \t\t  ")
sec_count = sum_mots*6

print(f"\n Total : \n\t {format_with_spaces(sum_mots)} mots.\n\t {format_with_spaces(sec_count)} signes espaces compris.\n\t {format_with_spaces(count_chapitres)} chapitres.")
print(f"Estimation de pages A4: {nombre_de_pages(sum_mots)} ")
print(f"Genre de livre: {genre_de_livre(sum_mots)}")
print(f"Estimation du temps de lecture: {format_time(temps_de_lecture(sum_mots))}")
print(f"Estimation du temps de rédaction à 30 mots/minute: {format_time(temps_de_redaction(sum_mots, 30))}")
print(f"Estimation du temps de rédaction à 70 mots/minute: {format_time(temps_de_redaction(sum_mots, 70))}")


