#!/usr/bin/env python3
"""
Script de test pour le scraping Instagram avec une approche robuste inspirée de cobalt.tools
"""

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 json
import logging
import time
import re
import tempfile
import os

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

def extract_video_id(url):
    """Extrait l'ID de la vidéo de l'URL Instagram"""
    match = re.search(r'/reel/([^/?]+)', url)
    return match.group(1) if match else None

def setup_driver():
    """Configure le driver Selenium avec des paramètres avancés"""
    chrome_options = Options()
    
    # Créer un répertoire temporaire unique pour le profil Chrome
    user_data_dir = tempfile.mkdtemp()
    
    # Configuration de base
    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}')
    
    # Configuration anti-détection
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')
    chrome_options.add_argument('--disable-web-security')
    chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    
    # Headers comme un vrai navigateur
    chrome_options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
    chrome_options.add_argument('--accept-lang=fr-FR,fr')
    
    driver = webdriver.Chrome(options=chrome_options)
    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    
    return driver

def inject_video_observer(driver):
    """Injecte un observateur JavaScript pour surveiller la vidéo"""
    js_code = """
    let video = document.querySelector('video');
    if (video) {
        let duration = 0;
        try {
            // Essayer d'obtenir la durée directement
            duration = video.duration;
        } catch (e) {
            // Si ça échoue, essayer de lire la vidéo
            video.play();
            video.pause();
            duration = video.duration;
        }
        return duration;
    }
    return null;
    """
    
    try:
        video_info = driver.execute_async_script("""
            let callback = arguments[arguments.length - 1];
            let code = arguments[0];
            eval(code)
                .then(result => callback(result))
                .catch(error => callback({'error': error}));
        """, js_code)
        
        return video_info
    except Exception as e:
        logger.error(f"Erreur lors de l'exécution du JavaScript: {str(e)}")
        return {'error': str(e)}

def get_video_data(url):
    """Récupère les données de la vidéo Instagram en utilisant différentes méthodes"""
    video_id = extract_video_id(url)
    if not video_id:
        logger.error("❌ ID de la vidéo non trouvé dans l'URL")
        return None
        
    driver = setup_driver()
    try:
        logger.info(f"🔍 Analyse du reel: {url}")
        
        # Méthode 1: Page publique embed
        embed_url = f"https://www.instagram.com/reel/{video_id}/embed/"
        logger.info(f"Tentative avec l'URL embed: {embed_url}")
        
        # Charger la page avec retry
        max_retries = 3
        for attempt in range(max_retries):
            try:
                driver.get(embed_url)
                WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.TAG_NAME, "body"))
                )
                time.sleep(2)
                
                # Injecter l'observateur et obtenir les informations de la vidéo
                # Exécuter le JavaScript pour obtenir la durée
                duration = driver.execute_script(inject_video_observer(driver))
                
                if duration:
                    logger.info(f"✅ Durée trouvée: {duration} secondes")
                    break
                else:
                    logger.warning(f"Tentative {attempt + 1}: Durée non trouvée")
                    if attempt < max_retries - 1:
                        time.sleep(2)
                        continue
                    if duration:
                        logger.info(f"✅ Durée trouvée: {duration} secondes")
                        break
            except Exception as e:
                logger.warning(f"Tentative {attempt + 1} échouée: {str(e)}")
                if attempt < max_retries - 1:
                    time.sleep(2)
                    continue
                else:
                    raise
        
        # Récupérer les méta-données
        try:
            meta_description = driver.find_element(By.CSS_SELECTOR, 'meta[property="og:description"]').get_attribute('content')
            if meta_description:
                logger.info(f"✅ Description trouvée: {meta_description[:100]}...")
                
                # Recherche des mots-clés
                keywords = ["Palia", "CROSSPLAY"]
                found_keywords = [kw for kw in keywords if kw in meta_description]
                if found_keywords:
                    logger.info(f"✅ Mots-clés trouvés: {', '.join(found_keywords)}")
        except:
            meta_description = None
            logger.warning("❌ Description non trouvée")
        
        return {
            "duration": duration if 'duration' in locals() else None,
            "description": meta_description,
            "url": url,
            "video_id": video_id
        }
            
    finally:
        driver.quit()

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