#!/usr/bin/env python3
"""
Script de test pour le scraping Instagram avec Selenium
"""

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import time
import json
import logging

# Configuration du logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def setup_driver():
    """Configure le driver Selenium"""
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    import tempfile
    import os
    
    # Créer un répertoire temporaire unique pour le profil Chrome
    user_data_dir = tempfile.mkdtemp()
    
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument(f'--user-data-dir={user_data_dir}')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')
    chrome_options.add_argument('--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
    
    # Ajout de préférences expérimentales
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)
    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    return driver

def scrape_instagram_reel(url):
    """Scrape les données d'un reel Instagram"""
    driver = setup_driver()
    try:
        logger.info(f"🔍 Scraping du reel: {url}")
        
        # D'abord essayer l'URL embed
        embed_url = url.replace("/reel/", "/reel/embed/")
        logger.info(f"Tentative avec l'URL embed: {embed_url}")
        
        driver.get(embed_url)
        time.sleep(2)  # Attente pour l'embed
        
        # Si on ne trouve pas la durée avec l'embed, essayer l'URL normale
        driver.get(url)
        time.sleep(3)  # Attente initiale
        
        # Attendre que le contenu soit chargé
        wait = WebDriverWait(driver, 10)
        
        # Plusieurs méthodes pour trouver la description
        methods = [
            # Méthode 1: Meta description
            lambda: wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'meta[property="og:description"]'))).get_attribute('content'),
            
            # Méthode 2: Article text
            lambda: wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'article'))).text,
            
            # Méthode 3: Span dans article
            lambda: wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'article span'))).text,
            
            # Méthode 4: Div avec rôle de description
            lambda: wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[role="menuitem"]'))).text,
        ]
        
        description = None
        for method in methods:
            try:
                description = method()
                if description:
                    logger.info(f"✅ Description trouvée: {description[:100]}...")
                    
                    # Recherche des mots-clés
                    keywords = ["Palia", "CROSSPLAY"]
                    found_keywords = [kw for kw in keywords if kw.lower() in description.lower()]
                    if found_keywords:
                        logger.info(f"✅ Mots-clés trouvés: {', '.join(found_keywords)}")
                    else:
                        logger.info("❌ Aucun mot-clé trouvé dans la description")
                    
                    break
            except TimeoutException:
                continue
        
        # Recherche de la durée
        duration = None
        duration_selectors = [
            ('meta[property="video:duration"]', 'content'),
            ('video[preload="auto"]', None),  # Utilisation de JavaScript
            ('[data-visualcompletion="media-vc-duration"]', 'text'),
            ('span._aacl._aaco._aacu._aacx._aad7._aade', 'text'),  # Nouveau sélecteur Instagram
            ('div._aamw', 'text'),  # Autre sélecteur Instagram
            ('div[role="presentation"] span.x1lliihq', 'text'),  # Sélecteur plus précis
            ('.EmbedFrame video', None),  # Sélecteur spécifique pour l'embed
            ('.EmbedFrame span[class*="VideoDuration"]', 'text'),  # Sélecteur de durée dans l'embed
            ('time', 'text')  # Fallback
        ]
        
        for selector, attr_type in duration_selectors:
            try:
                element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
                
                if attr_type is None:
                    # Utiliser JavaScript pour la vidéo
                    driver.execute_script("arguments[0].play(); arguments[0].pause();", element)
                    time.sleep(1)
                    duration = driver.execute_script("return arguments[0].duration;", element)
                    if duration:
                        logger.info(f"✅ Durée trouvée (video JS): {duration} secondes")
                        break
                else:
                    duration_text = element.get_attribute(attr_type) if attr_type != 'text' else element.text
                    
                    # Nettoyage et conversion du texte
                    if duration_text:
                        # Essayer de convertir MM:SS en secondes
                        if ':' in duration_text:
                            try:
                                minutes, seconds = map(int, duration_text.strip().split(':'))
                                duration = minutes * 60 + seconds
                                logger.info(f"✅ Durée trouvée ({selector}): {duration} secondes ({duration_text})")
                                break
                            except ValueError:
                                continue
                        # Essayer de convertir directement en nombre
                        else:
                            try:
                                duration = float(duration_text.strip())
                                logger.info(f"✅ Durée trouvée ({selector}): {duration} secondes")
                                break
                            except ValueError:
                                continue
            
            except TimeoutException:
                continue
        
        if duration is None:
            logger.warning("❌ Durée non trouvée")
            
            # Debug : afficher la source de la page
            page_source = driver.page_source
            logger.debug("Source de la page pour debug :")
            logger.debug(page_source[:500] + "...")
        
        # Capture d'écran pour debug
        driver.save_screenshot('instagram_debug.png')
        logger.info("✅ Screenshot de debug sauvegardé")
        
        return {
            'description': description,
            'duration': duration if 'duration' in locals() else None,
            'url': url
        }
        
    except Exception as e:
        logger.error(f"❌ Erreur: {str(e)}")
        import traceback
        traceback.print_exc()
        return None
        
    finally:
        driver.quit()

if __name__ == "__main__":
    url = "https://www.instagram.com/reel/DMpc37-tJdF/"
    result = scrape_instagram_reel(url)
    
    if result:
        print("\n📊 Résultats:")
        print(json.dumps(result, indent=2, ensure_ascii=False))
