#!/usr/bin/env python3
"""
Script de test pour le scraping Instagram inspiré 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

# 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()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    
    # Paramètres anti-détection
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')
    chrome_options.add_argument('--disable-web-security')
    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 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)
                # Attendre que le body soit chargé
                WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.TAG_NAME, "body"))
                )
                time.sleep(2)
                break
            except Exception as e:
                if attempt == max_retries - 1:
                    raise
                logger.warning(f"Tentative {attempt + 1} échouée, nouvelle tentative...")
                time.sleep(2)
        
        # Attendre que la vidéo soit chargée
        wait = WebDriverWait(driver, 10)
        
        try:
            # Attendre et cliquer sur la vidéo pour la charger
            video = wait.until(EC.presence_of_element_located((By.TAG_NAME, "video")))
            driver.execute_script("arguments[0].play(); arguments[0].pause();", video)
            time.sleep(1)
            
            # Récupérer la durée via JavaScript
            duration = driver.execute_script("return document.querySelector('video').duration")
            if duration:
                logger.info(f"✅ Durée trouvée (video.duration): {duration} secondes")
                
            # Récupérer les méta-données de l'OG
            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)}")
            
            # Si on n'a pas la durée, essayer d'autres méthodes
            if not duration:
                # Chercher dans le code source
                page_source = driver.page_source
                duration_match = re.search(r'"video_duration":\s*(\d+)', page_source)
                if duration_match:
                    duration = int(duration_match.group(1))
                    logger.info(f"✅ Durée trouvée (video_duration): {duration} secondes")
            
            return {
                "duration": duration,
                "description": meta_description,
                "url": url,
                "video_id": video_id
            }
            
        except Exception as e:
            logger.error(f"❌ Erreur lors de l'extraction des données: {str(e)}")
            return None
            
    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))
