# met à jour un fichier de suivi pour chaque livre
# le suivi se fait dans un fichier csv où chaque ligne est un compte rendu de statistiques du livre
# colonnes du csv: date; mots; intrigues; personnages; personnages_mots;

import csv
import os
from datetime import date, timedelta, datetime

def mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages):
    # Lire le fichier livre.org
    with open(fichier_livre, 'r') as f:
        contenu_livre = f.read()
        mots_livre = len(contenu_livre.split())
        chapitres = contenu_livre.count('* ')
        sous_chapitres = contenu_livre.count('** ') + contenu_livre.count('*** ') + contenu_livre.count('**** ')

    # Lire le fichier personnages.org
    with open(fichier_personnages, 'r') as f:
        contenu_personnages = f.read()
        personnages_mots = len(contenu_personnages.split())
        personnages = contenu_personnages.count('* ')

    # Récupérer les valeurs pour les autres colonnes
    intrigues = 5

    # Mettre à jour le fichier de suivi
    # Vérifier si le fichier existe et s'il commence par un commentaire
    file_exists = os.path.exists(fichier_csv)
    needs_comment = False

    if not file_exists:
        needs_comment = True
    else:
        with open(fichier_csv, 'r') as f:
            first_line = f.readline().strip()
            if not first_line.startswith('#'):
                needs_comment = True

    if needs_comment:
        # Sauvegarder le contenu existant si le fichier existe
        content = ""
        if file_exists:
            with open(fichier_csv, 'r') as f:
                content = f.read()
    
        # Réécrire le fichier avec un commentaire en tête
        with open(fichier_csv, 'w', newline='') as f:
            f.write('# Ce fichier est un CSV et ne doit pas être exécuté directement avec Python.\n')
            f.write('# Utilisez view_suivi_livre.py pour visualiser ces données.\n')
            if content:
                # Si le contenu commence par un commentaire, on le supprime
                # pour éviter la duplication
                if content.startswith('#'):
                    lines = content.split('\n')
                    # Trouver la première ligne qui n'est pas un commentaire ou une ligne vide
                    for i, line in enumerate(lines):
                        if not line.strip().startswith('#') and line.strip():
                            content = '\n'.join(lines[i:])
                            break
                f.write(content)

    # Ajouter la nouvelle ligne
    with open(fichier_csv, 'a', newline='') as csvfile:
        writer = csv.writer(csvfile, delimiter=';')
        now = datetime.now()
        ligne = [now.isoformat(), mots_livre, intrigues, personnages, personnages_mots, chapitres, sous_chapitres]
        writer.writerow(ligne)

# Exemple d'utilisation
fichier_csv ='suivi_livre.csv'
fichier_livre = 'livre.org'
fichier_personnages = 'personnages.org'

def analyse_csv(fichier_csv):

    with open(fichier_csv, 'r') as csvfile:
        reader = csv.reader(csvfile, delimiter=';')
        donnees = []
        for row in reader:
            # Ignorer les lignes de commentaire qui commencent par #
            if row and not row[0].startswith('#'):
                donnees.append(row)

    # Si aucune donnée valide n'a été trouvée, retourner
    if not donnees:
        print("Aucune donnée valide trouvée dans le fichier CSV.")
        return

    # Récupérer les dates et les nombres de mots
    dates = [datetime.fromisoformat(donnee[0]).date() for donnee in donnees]
    mots = [int(donnee[1]) for donnee in donnees]


    # Récupérer la date du jour
    aujourd_hui = date.today()
    oldest_count=0
    hier = aujourd_hui - timedelta(days=1)
    semaine_derniere = aujourd_hui - timedelta(days=7)
    mois_dernier = date(aujourd_hui.year, aujourd_hui.month - 1, aujourd_hui.day)

    # Récupérer la valeur des mots la plus récente parmi celles de la date du jour
    mots_aujourd_hui = 0
    mots_aujourd_hui_start = 0
    most_recent = 0

#     print("suivis: ",len(dates))
    most_recent = mots[len(dates)-1]

    for i, date_ in enumerate(dates):

        # trouver le premier décompte supérieur à 0
        if mots[i] > 0 and oldest_count == 0:
            oldest_count = mots[i]
#             print('oldest: ',oldest_count, " mots")
        if date_ == aujourd_hui:
            if mots_aujourd_hui_start == 0:
                mots_aujourd_hui_start = mots[i]
                print('au début du jour:' , mots_aujourd_hui_start)
        if date_ == aujourd_hui:
            mots_aujourd_hui = mots[i]

    # Récupérer la valeur des mots la plus récente du jour précédent
    mots_hier = 0
    for i, date_ in enumerate(dates):
        if date_ == hier:
            mots_hier = mots[i]
            break

    # Récupérer la valeur des mots la plus récente de la semaine dernière
    mots_semaine_derniere = 0
    for i, date_ in enumerate(dates):
        if semaine_derniere <= date_ < aujourd_hui:
            mots_semaine_derniere = mots[i]
            break

    # Compter le nombre de mots changés aujourd'hui
    mots_changés_aujourd_hui = most_recent - mots_aujourd_hui_start

    # Compter le nombre de mots changés depuis la date la plus récente dans la semaine dernière
    mots_changés_semaine_derniere = mots_aujourd_hui_start - mots_semaine_derniere

    # Afficher le résultat
    print("Nombres de mots changés aujourd'hui : ", mots_changés_aujourd_hui)
    print("Nombres de mots changés depuis la date la plus récente dans la semaine dernière : ", mots_changés_semaine_derniere)
    print("Total : ", most_recent," mots")
mise_a_jour_suivi(fichier_csv, fichier_livre, fichier_personnages)

analyse_csv(fichier_csv)
