#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Mercado Livre Product Scraper - Versão Simplificada
Extrai dados de produtos públicos do Mercado Livre via scraping (sem autenticação)
Adaptado para funcionar com o endpoint PHP get_product_info_authenticated.php
"""

import sys
import json
import requests
from bs4 import BeautifulSoup
import re

def scrape_product(mlb_id):
    """
    Faz scraping de um produto do Mercado Livre
    Acessa a página como um navegador normal e extrai os dados do HTML
    
    Args:
        mlb_id (str): ID do produto (ex: MLB5135143874)
    
    Returns:
        dict: Dados do produto no formato esperado pelo PHP
    """
    
    # Limpar o ID
    mlb_id_clean = mlb_id.replace('MLB', '').replace('-', '')
    
    # URL do produto - formato padrão do ML
    url = f"https://produto.mercadolivre.com.br/MLB-{mlb_id_clean}-_JM"
    
    # Headers que simulam um navegador Chrome real
    headers = {
        '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',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
        'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1',
        'DNT': '1'
    }
    
    try:
        # Criar sessão para manter cookies
        session = requests.Session()
        
        print(f"[INFO] Acessando: {url}", file=sys.stderr)
        response = session.get(url, headers=headers, timeout=20, allow_redirects=True)
        
        print(f"[INFO] Status Code: {response.status_code}", file=sys.stderr)
        print(f"[INFO] URL Final: {response.url}", file=sys.stderr)
        
        response.raise_for_status()
        
        # Parse HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # Inicializar dados do produto (formato compatível com PHP)
        product_data = {
            'name': None,
            'description': None,
            'pictures': [],
            'attributes': [],
            'source_url': response.url
        }
        
        # ===== EXTRAIR TÍTULO =====
        title = None
        
        # 1. Meta tag og:title
        meta_title = soup.find('meta', {'property': 'og:title'})
        if meta_title:
            title = meta_title.get('content', '').strip()
            # Remover preço do título
            title = re.sub(r'\s*[-|]\s*R\$\s*[\d.,]+\s*$', '', title)
            print(f"[OK] Titulo: {title[:50]}...", file=sys.stderr)
        
        # 2. H1 com classe ui-pdp-title
        if not title:
            h1 = soup.find('h1', {'class': 'ui-pdp-title'})
            if h1:
                title = h1.get_text(strip=True)
                title = re.sub(r'\s*[-|]\s*R\$\s*[\d.,]+\s*$', '', title)
        
        if title:
            product_data['name'] = title
        
        # ===== EXTRAIR DESCRIÇÃO =====
        description = None
        
        # 1. Buscar descrição completa
        desc_container = soup.find('div', class_=re.compile('ui-pdp-description.*', re.IGNORECASE))
        if desc_container:
            description = desc_container.get_text(separator='\n', strip=True)
            description = re.sub(r'^Descrição\s*', '', description, flags=re.IGNORECASE)
            print(f"[OK] Descricao: {len(description)} chars", file=sys.stderr)
        
        # 2. Fallback: Meta og:description
        if not description:
            meta_desc = soup.find('meta', {'property': 'og:description'})
            if meta_desc:
                description = meta_desc.get('content', '').strip()
        
        if description:
            product_data['description'] = description
        
        # ===== EXTRAIR IMAGENS =====
        pictures = []
        unique_urls = set()
        
        # 1. Meta og:image (imagem principal)
        meta_image = soup.find('meta', {'property': 'og:image'})
        if meta_image:
            img_url = meta_image.get('content', '')
            if img_url and re.search(r'-O\.(webp|jpg|png|jpeg)$', img_url, re.IGNORECASE):
                unique_urls.add(img_url)
        
        # 2. Buscar todas as imagens <img> com mlstatic.com
        all_img_tags = soup.find_all('img')
        for img in all_img_tags:
            for attr in ['src', 'data-src', 'data-zoom', 'data-lazy']:
                img_url = img.get(attr)
                if img_url and 'mlstatic.com' in img_url and ('D_NQ_NP' in img_url or 'D_Q_NP' in img_url):
                    clean_url = img_url.split('?')[0]
                    # Filtrar apenas imagens grandes (originais) com -O
                    if re.search(r'-O\.(webp|jpg|png|jpeg)$', clean_url, re.IGNORECASE):
                        unique_urls.add(clean_url)
        
        # 3. Buscar URLs diretas no HTML com regex
        html_text = str(soup)
        url_pattern = re.compile(r'https?://[^\s"\'>]*mlstatic\.com[^\s"\'>]*(?:D_NQ_NP|D_Q_NP)[^\s"\'>]*', re.IGNORECASE)
        for match in url_pattern.finditer(html_text):
            img_url = match.group(0)
            clean_url = img_url.split('?')[0].split('"')[0].split("'")[0].split('>')[0]
            if re.search(r'-O\.(webp|jpg|png|jpeg)$', clean_url, re.IGNORECASE):
                unique_urls.add(clean_url)
        
        # Converter para lista de URLs (formato esperado pelo PHP)
        if unique_urls:
            pictures = list(sorted(unique_urls))
            product_data['pictures'] = pictures
            print(f"[OK] Total de imagens: {len(pictures)}", file=sys.stderr)
        
        # ===== EXTRAIR ATRIBUTOS/CARACTERÍSTICAS =====
        attributes = []
        
        # Estratégia 1: Buscar por tabelas andes-table
        tables = soup.find_all('table', class_='andes-table')
        for table in tables:
            rows = table.find_all('tr')
            for row in rows:
                th = row.find('th')
                td = row.find('td')
                if th and td:
                    name = th.get_text(strip=True)
                    value = td.get_text(strip=True)
                    if name and value:
                        attributes.append({'name': name, 'value_name': value})
        
        # Estratégia 2: Buscar por definition lists (dl/dt/dd)
        if not attributes:
            attributes_dl = soup.find_all('dl', class_=re.compile('ui-pdp-.*specs.*', re.IGNORECASE))
            for dl in attributes_dl:
                dts = dl.find_all('dt')
                dds = dl.find_all('dd')
                for dt, dd in zip(dts, dds):
                    name = dt.get_text(strip=True)
                    value = dd.get_text(strip=True)
                    if name and value:
                        attributes.append({'name': name, 'value_name': value})
        
        if attributes:
            product_data['attributes'] = attributes
            print(f"[OK] Total de atributos: {len(attributes)}", file=sys.stderr)
        
        # ===== VALIDAR DADOS MÍNIMOS =====
        if product_data.get('name'):
            print(f"[SUCCESS] Produto extraido com sucesso!", file=sys.stderr)
            return product_data
        
        # Falha - dados insuficientes
        print(f"[ERROR] Dados insuficientes - titulo nao encontrado", file=sys.stderr)
        return None
        
    except requests.exceptions.HTTPError as e:
        print(f"[ERROR] HTTP Error: {e.response.status_code}", file=sys.stderr)
        return None
    except requests.exceptions.RequestException as e:
        print(f"[ERROR] Request failed: {str(e)}", file=sys.stderr)
        return None
    except Exception as e:
        print(f"[ERROR] Unexpected error: {str(e)}", file=sys.stderr)
        import traceback
        traceback.print_exc(file=sys.stderr)
        return None


if __name__ == '__main__':
    if len(sys.argv) < 2:
        result = {
            'error': 'MLB ID is required',
            'usage': 'python ml_scraper_simples.py MLB5135143874'
        }
        print(json.dumps(result, ensure_ascii=False))
        sys.exit(1)
    
    mlb_id = sys.argv[1].strip().upper()
    
    # Garantir que tem o prefixo MLB
    if not mlb_id.startswith('MLB'):
        mlb_id = 'MLB' + mlb_id
    
    result = scrape_product(mlb_id)
    
    if result:
        # Output JSON no formato esperado pelo PHP
        print(json.dumps(result, ensure_ascii=False))
    else:
        # Retornar erro
        error_result = {
            'error': 'Failed to extract product data',
            'name': None,
            'description': None,
            'pictures': [],
            'attributes': []
        }
        print(json.dumps(error_result, ensure_ascii=False))
        sys.exit(1)
