#!/usr/bin/env python3
"""
RSS News Updater for TechNews Website
Récupère les flux RSS et met à jour le fichier HTML automatiquement
"""

import feedparser
import re
from datetime import datetime
from pathlib import Path
import html

# Configuration
HTML_FILE = "/var/www/oracle-second/gemini/index.html"
RSS_FEEDS = [
    "https://techcrunch.com/feed/",
    "https://www.theverge.com/rss/index.xml",
    "https://www.wired.com/feed/rss",
    "https://feeds.arstechnica.com/arstechnica/index",
    "https://www.zdnet.com/news/rss.xml",
]

# Mapping des catégories basé sur les tags/mots-clés
CATEGORY_MAPPING = {
    'ai': ['AI', 'artificial intelligence', 'machine learning', 'gpt', 'openai', 'chatgpt', 'anthropic', 'llm'],
    'cyber': ['security', 'cybersecurity', 'hack', 'breach', 'malware', 'ransomware', 'vulnerability'],
    'mobile': ['mobile', 'smartphone', 'iphone', 'android', 'samsung', 'apple', 'google pixel'],
    'cloud': ['cloud', 'aws', 'azure', 'gcp', 'server', 'datacenter', 'saas'],
    'quantum': ['quantum', 'quantum computing', 'qubit'],
    'blockchain': ['blockchain', 'crypto', 'bitcoin', 'ethereum', 'web3', 'nft'],
    'space': ['space', 'spacex', 'nasa', 'rocket', 'satellite', 'starship'],
}

# Icônes Font Awesome pour chaque catégorie
CATEGORY_ICONS = {
    'ai': 'fa-robot',
    'cyber': 'fa-shield-alt',
    'mobile': 'fa-mobile-alt',
    'cloud': 'fa-cloud',
    'quantum': 'fa-atom',
    'blockchain': 'fa-link',
    'space': 'fa-rocket',
}

def get_category(title, description):
    """Détermine la catégorie basée sur les mots-clés"""
    title_lower = title.lower()
    desc_lower = description.lower()
    combined = f"{title_lower} {desc_lower}"

    for category, keywords in CATEGORY_MAPPING.items():
        for keyword in keywords:
            if keyword.lower() in combined:
                return category
    return 'ai'  # Catégorie par défaut

def clean_text(text, max_length=150):
    """Nettoie et coupe le texte"""
    # Supprimer les balises HTML
    text = re.sub('<[^<]+?>', '', text)
    # Décoder les entités HTML
    text = html.unescape(text)
    # Couper si trop long
    if len(text) > max_length:
        text = text[:max_length].rsplit(' ', 1)[0] + '...'
    return text.strip()

def format_date(entry):
    """Formate la date de manière relative"""
    if hasattr(entry, 'published_parsed') and entry.published_parsed:
        published = datetime(*entry.published_parsed[:6])
        now = datetime.now()
        diff = now - published

        hours = diff.total_seconds() / 3600
        if hours < 1:
            return "À l'instant"
        elif hours < 24:
            return f"Il y a {int(hours)} heure{'s' if int(hours) > 1 else ''}"
        elif hours < 48:
            return "Hier"
        else:
            return f"Il y a {int(hours/24)} jours"
    return "Récemment"

def fetch_rss_items(max_items=15):
    """Récupère les articles depuis les flux RSS"""
    all_items = []

    for feed_url in RSS_FEEDS:
        try:
            print(f"[INFO] Récupération du flux: {feed_url}")
            feed = feedparser.parse(feed_url)

            if feed.bozo:
                print(f"[WARNING] Erreur de parsing pour {feed_url}: {feed.bozo_exception}")
                continue

            for entry in feed.entries:
                title = entry.get('title', 'Sans titre')
                description = entry.get('description', entry.get('summary', ''))
                link = entry.get('link', '#')
                date_str = format_date(entry)

                # Nettoyer la description
                description = clean_text(description)

                category = get_category(title, description)

                all_items.append({
                    'title': clean_text(title, 100),
                    'description': description,
                    'link': link,
                    'date': date_str,
                    'category': category,
                    'icon': CATEGORY_ICONS.get(category, 'fa-microchip'),
                    'source': feed.feed.get('title', feed_url.split('/')[2])
                })

        except Exception as e:
            print(f"[ERROR] Erreur lors de la récupération de {feed_url}: {e}")

    # Trier par date (approximative basée sur l'ordre du flux)
    all_items = all_items[:max_items]
    return all_items

def generate_news_card(item, index):
    """Génère le HTML pour une carte de news"""
    animation_delay = index * 0.05
    return f'''            <article class="news-card" style="animation-delay: {animation_delay}s">
                <div class="news-card-image {item['category']}">
                    <i class="fas {item['icon']}"></i>
                </div>
                <div class="news-card-content">
                    <span class="news-card-category">{item['source']}</span>
                    <h3>{item['title']}</h3>
                    <p>{item['description']}</p>
                    <div class="news-card-footer">
                        <span><i class="far fa-clock"></i> {item['date']}</span>
                        <span><i class="fas fa-external-link-alt"></i></span>
                    </div>
                </div>
            </article>'''

def generate_trending_item(item, rank):
    """Génère le HTML pour un item trending"""
    category_names = {
        'ai': 'IA',
        'cyber': 'Cybersécurité',
        'mobile': 'Mobile',
        'cloud': 'Cloud',
        'quantum': 'Quantum',
        'blockchain': 'Blockchain',
        'space': 'Espace'
    }
    cat_name = category_names.get(item['category'], 'Tech')
    return f'''                <div class="trending-item">
                    <div class="trending-rank">{rank}</div>
                    <div class="trending-content">
                        <h4>{item['title']}</h4>
                        <span>{cat_name} • {item['date']}</span>
                    </div>
                </div>'''

def update_html(items):
    """Met à jour le fichier HTML avec les nouvelles actualités"""
    try:
        # Lire le fichier HTML existant
        with open(HTML_FILE, 'r', encoding='utf-8') as f:
            html_content = f.read()

        # Séparer le contenu avant et après la news grid
        # On cherche les marqueurs spécifiques
        news_grid_start = '<!-- News Grid -->'
        news_grid_end = '</div>\n\n        <!-- Trending Section -->'

        # Générer le nouveau contenu pour la news grid
        news_cards_html = '\n'.join([generate_news_card(item, i) for i, item in enumerate(items)])

        # Remplacer la section news grid
        pattern = r'<!-- News Grid -->.*?</div>\n\n        <!-- Trending Section -->'
        replacement = f'''<!-- News Grid -->
        {news_cards_html}
        </div>

        <!-- Trending Section -->'''

        new_html_content = re.sub(pattern, replacement, html_content, flags=re.DOTALL)

        # Générer le nouveau contenu pour le trending section (top 5)
        trending_items = items[:5]
        trending_html = '\n'.join([generate_trending_item(item, i+1) for i, item in enumerate(trending_items)])

        # Remplacer la section trending
        pattern_trending = r'<div class="trending-list">.*?</div>\n\n        <!-- Categories -->'
        replacement_trending = f'''<div class="trending-list">
            {trending_html}
        </div>

        <!-- Categories -->'''

        new_html_content = re.sub(pattern_trending, replacement_trending, new_html_content, flags=re.DOTALL)

        # Ajouter la date de dernière mise à jour dans le hero stats
        update_time = datetime.now().strftime('%d/%m/%Y à %H:%M')
        new_html_content = new_html_content.replace(
            '24/7',
            f'Mis à jour le {update_time}'
        )

        # Écrire le nouveau contenu
        with open(HTML_FILE, 'w', encoding='utf-8') as f:
            f.write(new_html_content)

        print(f"[SUCCESS] {len(items)} articles ajoutés au site")
        print(f"[SUCCESS] Fichier HTML mis à jour: {HTML_FILE}")
        return True

    except Exception as e:
        print(f"[ERROR] Erreur lors de la mise à jour du HTML: {e}")
        return False

def main():
    """Fonction principale"""
    print("=" * 60)
    print("RSS NEWS UPDATER")
    print("=" * 60)
    print(f"[START] Début de la mise à jour - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

    # Récupérer les articles RSS
    items = fetch_rss_items(max_items=15)

    if not items:
        print("[ERROR] Aucun article récupéré")
        return False

    print(f"[INFO] {len(items)} articles récupérés depuis les flux RSS")

    # Mettre à jour le fichier HTML
    success = update_html(items)

    if success:
        print(f"[COMPLETE] Mise à jour terminée avec succès - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    else:
        print("[FAILED] Échec de la mise à jour")

    print("=" * 60)
    return success

if __name__ == "__main__":
    main()
