# -*- coding: utf-8 -*-

# librairies
import os
import time
import pandas
from email import policy
from email.parser import BytesParser
#import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer

# ----------- Configuration -----------

EMAIL_FOLDER = "emails"  # sous-dossier contenant les fichiers d'e-mails

# nécessaire une seule fois dans l'environnement
#nltk.download('vader_lexicon')

# Chargement du modèle de sentiment (anglais)
sentiment_analyzer = SentimentIntensityAnalyzer()

# ----------- Fonctions -----------

# Parse un fichier et extrait les champs demandés de l'e-mail
def parse_email_file(file_path):

    #lecture du fichier
    with open(file_path, "rb") as f:
        msg = BytesParser(policy=policy.default).parse(f)

    message_id = msg.get("Message-ID", "")
    date = msg.get("Date", "")
    sender = msg.get("From", "")
    body = extract_email_body(msg)

    return {
        "message_id": message_id,
        "date": date,
        "sender": sender,
        "body": body
    }
    
# Extrait le corps de texte d'un email.
def extract_email_body(msg):
    #on va au plus simple
    return msg.get_payload(decode=True).decode(errors="ignore")

# Calcule le sentiment du mail.
def analyze_sentiment(email_data):
    
    # récuperation du corps du message
    text = email_data["body"]

    # si vide
    if not text.strip():
        #score de positivité nul
        result = 0
    else:    
        # appel de l'objet de calcul des sentimens
        # score de positivité
        result = sentiment_analyzer.polarity_scores(text)["pos"]

    # integration des resultats dans le mail
    email_data["score"] = result
    
    return email_data
    

# ----------- Traitement principal -----------

def process_email_folder(folder_path):
    # liste de dictionnaires
    # dictionnaire = un message avec ses différentes sections
    results = []

    #pour chaque élément dans le dossier à traiter
    for filename in os.listdir(folder_path):
        
        # nom complet : chemin + nom du fichier
        file_path = os.path.join(folder_path, filename)

        # On vérifie juste que c’est un fichier (pas un dossier)
        if os.path.isfile(file_path):

            try:
                # extraire les différentes parties
                email_data = parse_email_file(file_path)
                
                #calculer le "sentiment" à partir du corps du message
                email_data = analyze_sentiment(email_data)

                results.append(email_data)

            except Exception as e:
                print(f"Erreur avec {filename}: {e}")

    return results


# programme principal
if __name__ == "__main__":
    
    print("Debut du traitement...")
    
    #debut chrono
    debut = time.time()  
    # lacement du processus
    all_results = process_email_folder(EMAIL_FOLDER)
    # fin chrono
    duree = time.time() - debut

    print(f"\nFin du traitement, duree = {duree} sec.\n")
        
    # mettre sous la forme d'un data frame
    df = pandas.DataFrame(all_results)
    #affichage des infos
    #print(df.info())
      
    #trier selon l'id
    df = df.sort_values("message_id")
    # et affichage
    print(df[['date','score']].head(10))
