#!/usr/bin/env python3
"""
Scraper do Mercado Livre com autenticação persistente
Mantém login ativo para evitar bloqueios
"""

import json
import os
from playwright.sync_api import sync_playwright
import time


class MercadoLivreScraper:
    def __init__(self, cookies_file="ml_cookies.json", headless=False):
        """
        Inicializa o scraper
        
        Args:
            cookies_file: Arquivo para salvar/carregar cookies
            headless: True para rodar sem interface gráfica
        """
        self.cookies_file = cookies_file
        self.headless = headless
        self.browser = None
        self.context = None
        self.page = None
    
    def iniciar_navegador(self):
        """Inicia o navegador e carrega cookies se existirem"""
        playwright = sync_playwright().start()
        
        # Configurações para evitar detecção de bot
        self.browser = playwright.chromium.launch(
            headless=self.headless,
            args=[
                '--disable-blink-features=AutomationControlled',
                '--disable-dev-shm-usage',
                '--no-sandbox'
            ]
        )
        
        # Contexto com user agent real
        self.context = self.browser.new_context(
            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',
            viewport={'width': 1920, 'height': 1080},
            locale='pt-BR',
            timezone_id='America/Sao_Paulo'
        )
        
        # Carregar cookies se existirem
        if os.path.exists(self.cookies_file):
            print(f"📂 Carregando cookies de {self.cookies_file}")
            with open(self.cookies_file, 'r') as f:
                cookies = json.load(f)
                self.context.add_cookies(cookies)
        
        self.page = self.context.new_page()
        
        # Remove indicadores de automação
        self.page.add_init_script("""
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            });
        """)
    
    def fazer_login_manual(self, tempo_espera=60):
        """
        Abre o navegador para você fazer login manualmente
        
        Args:
            tempo_espera: Tempo em segundos para fazer login (padrão: 60s)
        """
        print("🌐 Abrindo Mercado Livre para login manual...")
        self.page.goto('https://www.mercadolivre.com.br/')
        
        print(f"\n⏰ Você tem {tempo_espera} segundos para fazer login manualmente!")
        print("👉 Clique em 'Entre' e faça login com suas credenciais")
        print("👉 Após login bem-sucedido, aguarde e os cookies serão salvos automaticamente\n")
        
        time.sleep(tempo_espera)
        
        # Salvar cookies
        self.salvar_cookies()
        print("✅ Cookies salvos! Você não precisará fazer login novamente.")
    
    def fazer_login_automatico(self, email, senha):
        """
        Tenta fazer login automaticamente (pode precisar de ajustes nos seletores)
        
        Args:
            email: Seu email do Mercado Livre
            senha: Sua senha
        """
        print("🌐 Acessando Mercado Livre...")
        self.page.goto('https://www.mercadolivre.com.br/')
        
        try:
            # Clica no botão de login
            self.page.click('text=Entre', timeout=5000)
            time.sleep(2)
            
            # Preenche email
            self.page.fill('input[id="user_id"]', email)
            self.page.click('button:has-text("Continuar")')
            time.sleep(2)
            
            # Preenche senha
            self.page.fill('input[id="password"]', senha)
            self.page.click('button[type="submit"]')
            
            # Aguarda login
            print("⏳ Aguardando login...")
            time.sleep(5)
            
            # Verifica se logou (procura pelo nome do usuário ou menu)
            if self.page.locator('text=Minha conta').count() > 0:
                print("✅ Login realizado com sucesso!")
                self.salvar_cookies()
                return True
            else:
                print("⚠️ Login pode ter falha. Verifique captcha ou credenciais.")
                return False
                
        except Exception as e:
            print(f"❌ Erro no login automático: {e}")
            print("💡 Use fazer_login_manual() para fazer login manualmente")
            return False
    
    def salvar_cookies(self):
        """Salva os cookies da sessão atual"""
        cookies = self.context.cookies()
        with open(self.cookies_file, 'w') as f:
            json.dump(cookies, f, indent=2)
        print(f"💾 Cookies salvos em {self.cookies_file}")
    
    def verificar_login(self):
        """Verifica se está logado"""
        try:
            self.page.goto('https://www.mercadolivre.com.br/', timeout=10000)
            time.sleep(2)
            
            # Verifica se tem o menu de conta
            if self.page.locator('text=Minha conta').count() > 0:
                print("✅ Sessão ativa - você está logado!")
                return True
            else:
                print("❌ Não está logado. Faça login primeiro.")
                return False
        except Exception as e:
            print(f"⚠️ Erro ao verificar login: {e}")
            return False
    
    def extrair_dados_produto(self, url):
        """
        Extrai dados de um produto do Mercado Livre
        
        Args:
            url: URL do produto
            
        Returns:
            dict com titulo, descricao e imagens
        """
        print(f"🔍 Extraindo dados de: {url}")
        
        try:
            self.page.goto(url, timeout=30000)
            time.sleep(3)  # Aguarda carregamento completo
            
            # TÍTULO
            titulo = None
            try:
                titulo = self.page.locator('h1.ui-pdp-title').first.inner_text()
            except:
                print("⚠️ Não foi possível extrair o título")
            
            # DESCRIÇÃO
            descricao = None
            try:
                # Scroll até a seção de descrição
                self.page.evaluate("window.scrollTo(0, 1000)")
                time.sleep(2)
                
                # Tenta vários seletores comuns do ML
                seletores = [
                    'p.ui-pdp-description__content',
                    'div.ui-pdp-description__content',
                    'div.ui-pdp-description',
                    'div[class*="description"]',
                    'p[class*="description"]'
                ]
                
                for seletor in seletores:
                    desc_elem = self.page.locator(seletor).first
                    if desc_elem.count() > 0:
                        descricao = desc_elem.inner_text()
                        break
                
                # Se não encontrou, tenta buscar pela tag description
                if not descricao:
                    desc_meta = self.page.locator('meta[name="description"]').first
                    if desc_meta.count() > 0:
                        descricao = desc_meta.get_attribute('content')
                        
            except Exception as e:
                print(f"⚠️ Não foi possível extrair a descrição: {e}")
            
            # IMAGENS
            imagens = []
            try:
                # Seleciona todas as imagens da galeria
                imgs = self.page.locator('figure img.ui-pdp-gallery__figure__image').all()
                
                for img in imgs:
                    # Tenta pegar a URL de alta resolução
                    url_img = img.get_attribute('data-zoom') or img.get_attribute('src')
                    
                    if url_img and url_img.startswith('http'):
                        imagens.append(url_img)
                
                # Remove duplicadas
                imagens = list(dict.fromkeys(imagens))
                
            except Exception as e:
                print(f"⚠️ Erro ao extrair imagens: {e}")
            
            # ATRIBUTOS
            atributos = []
            try:
                # Scroll até a seção de especificações
                self.page.evaluate("window.scrollTo(0, 1500)")
                time.sleep(2)
                
                # Tenta encontrar a tabela de especificações técnicas
                # Seletor comum: table com classe de especificações
                spec_rows = self.page.locator('table.andes-table tr').all()
                
                if not spec_rows or len(spec_rows) == 0:
                    # Tenta outro seletor comum
                    spec_rows = self.page.locator('div.ui-pdp-container__row div.ui-pdp-specs tr').all()
                
                if not spec_rows or len(spec_rows) == 0:
                    # Tenta seletor mais genérico
                    spec_items = self.page.locator('[class*="specs"] tr, [class*="specification"] tr').all()
                    spec_rows = spec_items
                
                for row in spec_rows:
                    try:
                        # Tenta extrair nome e valor do atributo
                        th = row.locator('th').first
                        td = row.locator('td').first
                        
                        if th.count() > 0 and td.count() > 0:
                            nome = th.inner_text().strip()
                            valor = td.inner_text().strip()
                            
                            if nome and valor:
                                atributos.append({
                                    'name': nome,
                                    'value_name': valor
                                })
                    except:
                        continue
                
                # Se não encontrou pela tabela, tenta pelo HTML estruturado
                if len(atributos) == 0:
                    # Alguns produtos usam divs ao invés de tabela
                    spec_divs = self.page.locator('[class*="spec"] [class*="label"], [class*="attribute"] [class*="label"]').all()
                    
                    for i in range(0, len(spec_divs), 2):
                        try:
                            if i + 1 < len(spec_divs):
                                nome = spec_divs[i].inner_text().strip()
                                valor = spec_divs[i + 1].inner_text().strip()
                                
                                if nome and valor:
                                    atributos.append({
                                        'name': nome,
                                        'value_name': valor
                                    })
                        except:
                            continue
                
                print(f"📋 Atributos extraídos: {len(atributos)}")
                        
            except Exception as e:
                print(f"⚠️ Erro ao extrair atributos: {e}")
            
            resultado = {
                "titulo": titulo,
                "descricao": descricao,
                "imagens": imagens,
                "atributos": atributos,
                "url": url
            }
            
            print(f"✅ Dados extraídos: {len(imagens)} imagens, {len(atributos)} atributos")
            return resultado
            
        except Exception as e:
            print(f"❌ Erro ao extrair dados: {e}")
            return None
    
    def fechar(self):
        """Fecha o navegador"""
        if self.browser:
            self.browser.close()
            print("🔒 Navegador fechado")


# =========================
# EXEMPLO DE USO
# =========================
if __name__ == "__main__":
    scraper = MercadoLivreScraper(headless=False)  # headless=True para rodar sem interface
    
    try:
        scraper.iniciar_navegador()
        
        # Verifica se já está logado
        if not scraper.verificar_login():
            print("\n" + "="*60)
            print("PRIMEIRA VEZ - NECESSÁRIO FAZER LOGIN")
            print("="*60)
            
            # OPÇÃO 1: Login manual (recomendado)
            scraper.fazer_login_manual(tempo_espera=60)
            
            # OPÇÃO 2: Login automático (pode falhar com captcha)
            # scraper.fazer_login_automatico('seu_email@exemplo.com', 'sua_senha')
        
        # Agora você pode extrair dados de produtos
        url_produto = "https://produto.mercadolivre.com.br/MLB-5706409880-calcas-cargo-masculinas-casu-com-varios-bolsos-beach-bermuda-_JM"
        
        dados = scraper.extrair_dados_produto(url_produto)
        
        if dados:
            print("\n" + "="*60)
            print("📌 TÍTULO:")
            print(dados["titulo"])
            
            print("\n📝 DESCRIÇÃO:")
            print(dados["descricao"][:200] + "..." if dados["descricao"] else "N/A")
            
            print("\n🖼️ IMAGENS:")
            for i, img in enumerate(dados["imagens"], 1):
                print(f"{i}. {img}")
        
    finally:
        input("\n⏸️ Pressione ENTER para fechar o navegador...")
        scraper.fechar()
