import requests
from icalendar import Calendar
import mysql.connector
import time
import re

URL_ICS = "https://edt.univ-lyon1.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=6161&projectId=1&calType=ical&firstDate=2026-08-18&lastDate=2027-08-01"

DB_CONFIG = {
    'host': 'localhost',
    'user': 'nicolas',
    'password': 'EDT_LYON1_MDP123!',
    'database': 'emploi_du_temps'
}

def fetch_and_update_db():
    while True:
        print(f"[{time.strftime('%H:%M:%S' )}] Vérification de l'emploi du temps...")
        try:
            response = requests.get(URL_ICS)
            if response.status_code == 200:
                cal = Calendar.from_ical(response.content)
                cours_extraits = []

                # 1. Parsing du fichier ICS
                for component in cal.walk():
                    if component.name == "VEVENT":
                        # Nettoyage profond : suppression des espaces aux extrémités et harmonisation des retours à la ligne
                        titre = str(component.get('summary', 'Sans titre')).strip()
                        salle = str(component.get('location', 'Pas de salle')).strip()
                        # Nettoyage profond et suppression de la balise "Exporté le:"
                        desc_brute = str(component.get('description', '')).replace('\r\n', '\n')
                        prof_ou_desc = re.sub(r'\(Exporté le:.*?\)', '', desc_brute).strip()
                        
                        dtstart = component.get('dtstart').dt
                        dtend = component.get('dtend').dt
                        
                        if hasattr(dtstart, 'strftime'):
                            debut = dtstart.strftime('%Y-%m-%d %H:%M:%S')
                            fin = dtend.strftime('%Y-%m-%d %H:%M:%S')
                            cours_extraits.append((titre, salle, prof_ou_desc, debut, fin))

                conn = mysql.connector.connect(**DB_CONFIG)
                cursor = conn.cursor()

                # 2. Récupération de l'ancien planning avec nettoyage
                cursor.execute("SELECT titre, salle, prof_ou_desc, date_debut, date_fin FROM planning")
                cours_db = cursor.fetchall()

                cours_db_str = []
                for row in cours_db:
                    debut = row[3].strftime('%Y-%m-%d %H:%M:%S') if hasattr(row[3], 'strftime') else str(row[3])
                    fin = row[4].strftime('%Y-%m-%d %H:%M:%S') if hasattr(row[4], 'strftime') else str(row[4])
                    
                    # On sécurise au cas où la BDD renvoie None et on nettoie comme pour l'ICS
                    titre_db = str(row[0] or 'Sans titre').strip()
                    salle_db = str(row[1] or 'Pas de salle').strip()
                    desc_db = str(row[2] or '').replace('\r\n', '\n').strip()
                    
                    cours_db_str.append((titre_db, salle_db, desc_db, debut, fin))

                # 3. Comparaison stricte
                set_extraits = set(cours_extraits)
                set_db = set(cours_db_str)

                if set_extraits != set_db:
                    print("⚠️ Changement détecté ! Mise à jour de la base...")
                    
                    # --- ASTUCE DE DEBUG ---
                    # Si ça boucle encore, ces lignes vont imprimer EXACTEMENT ce qui diffère dans tes logs
                    diff = set_extraits.symmetric_difference(set_db)
                    print(f"🔍 Nombre de différences : {len(diff)}")
                    if len(diff) > 0:
                        print(f"Exemple de différence (ICS vs DB) : {list(diff)[0]}")
                    # -----------------------

                    cursor.execute("TRUNCATE TABLE planning")
                    sql = "INSERT INTO planning (titre, salle, prof_ou_desc, date_debut, date_fin) VALUES (%s, %s, %s, %s, %s)"
                    cursor.executemany(sql, cours_extraits)
                    conn.commit()

                    # 4. Envoi des notifications Push
                    cursor.execute("SELECT token FROM push_tokens")
                    tokens = [row[0] for row in cursor.fetchall()]
                    
                    for token in tokens:
                        requests.post(
                            "https://exp.host/--/api/v2/push/send",
                            json={
                                "to": token, 
                                "title": "Emploi du temps modifié 🚨", 
                                "body": "Ton planning de l'université vient d'être mis à jour !"
                            }
                        )
                else:
                    print("✅ Aucun changement.")

                cursor.close()
                conn.close()

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

        # Pause de 20 minutes (1200 secondes) avant le prochain cycle
        time.sleep(1200)

if __name__ == "__main__":
    fetch_and_update_db()
