#!/var/www/prod/INCONGRUES/venv/bin/python
# -*- coding: utf-8 -*-
import feedparser
import requests
from icalendar import Calendar, Event
from datetime import datetime, timedelta
import os
import re
import sys
import logging

# Config
RSS_URL = 'https://www.musiques-incongrues.net/atom/t/agenda'
ICS_PATH = '/var/www/prod/INCONGRUES/agenda-musiques.ics'
LOG_PATH = '/var/www/prod/INCONGRUES/cron.log'

# Logging
logging.basicConfig(filename=LOG_PATH, level=logging.INFO, 
                    format='%(asctime)s - %(levelname)s - %(message)s')
console = logging.StreamHandler(sys.stdout)
console.setLevel(logging.INFO)
logging.getLogger().addHandler(console)

def parse_date_atom(date_str):
    """Parse ATOM date flexible: YYYY-MM-DD ou YYYY-MM-DDTHH:MM:SSZ"""
    if not date_str:
        return None
    # Patterns courants ATOM/RSS
    patterns = [
        '%Y-%m-%dT%H:%M:%SZ', '%Y-%m-%dT%H:%M:%S%z',
        '%Y-%m-%dT%H:%M:%S', '%Y-%m-%d %H:%M:%S',
        '%Y-%m-%dT%H:%M', '%Y-%m-%d'
    ]
    for fmt in patterns:
        try:
            return datetime.strptime(date_str, fmt)
        except ValueError:
            pass
    return None

os.makedirs(os.path.dirname(ICS_PATH), exist_ok=True)
cal = Calendar()
cal.add('prodid', '-//JulienLauzes//MusiquesIncongrues RSS2ICS//v1.0//')
cal.add('version', '2.0')
cal.add('calscale', 'GREGORIAN')
cal.add('X-WR-CALNAME', 'Musiques Incongrues - Agenda')
cal.add('X-WR-CALDESC', 'Événements musicaux via RSS/ATOM')

try:
    logging.info(f"Fetch RSS: {RSS_URL}")
    feed = feedparser.parse(RSS_URL)
    
    if not feed.entries:
        raise ValueError("Aucun événement dans le flux")
    
    events_added = 0
    for i, entry in enumerate(feed.entries[:200]):  # Top 200 pour 3-6 mois
        try:
            event = Event()
            event.add('uid', f'musiques-incongrues-{hash(entry.title + str(entry.id))}')
            event.add('summary', entry.title or 'Concert / Événement')
            desc = f"{entry.summary or ''}\n\nLien: {entry.link or 'N/A'}"
            if 'author' in entry:
                desc += f"\nPar: {entry.author}"
            event.add('description', desc.strip())
            event.add('url', entry.link)
            
            # Date start
            dtstart = parse_date_atom(entry.get('published') or entry.get('updated') or entry.get('atom_published'))
            if dtstart:
                event.add('dtstart', dtstart)
                # Fin: +2h si heure, fin de jour sinon
                if dtstart.hour > 0:
                    event.add('dtend', dtstart + timedelta(hours=2))
                else:
                    event.add('dtend', dtstart.replace(hour=23, minute=59, second=59))
                events_added += 1
            
            # Lieu si dispo (souvent dans summary)
            if 'venue' in entry.summary.lower() or re.search(r'(la\s+\w+|le\s+\w+|-\s*\w+)', entry.summary, re.I):
                event.add('location', re.search(r'([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\s*(?:-\s*)?\d*)', entry.summary).group(1) if re.search(r'([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\s*(?:-\s*)?\d*)', entry.summary) else 'Paris')
            
            cal.add_component(event)
            logging.info(f"Événement {i+1}: {entry.title[:50]}...")
            
        except Exception as e:
            logging.warning(f"Skip événement {i}: {e}")
    
    with open(ICS_PATH, 'wb') as f:
        f.write(cal.to_ical())
    
    logging.info(f"SUCCESS: {ICS_PATH} généré - {events_added} événements / {len(feed.entries)} total")
    print(f"✅ {events_added} événements → http://prod.lauzesjulien.com/INCONGRUES/agenda-musiques.ics")
    
except Exception as e:
    logging.error(f"ERREUR globale: {e}")
    print(f"❌ Erreur: {e}")
    sys.exit(1)
