#!/usr/bin/env python3
"""
Scraper CMA CGM - se CONECTA a tu Chrome real (anti-DataDome).

CMA CGM usa DataDome, que detecta y bloquea cualquier Chrome lanzado por
automation (undetected_chromedriver, Selenium, Puppeteer, Playwright...).
La forma fiable y GRATIS de leer la página es conectarse a TU navegador
Chrome real, que ya tiene una cookie `datadome` legítima y una huella humana.

──────────────────────────────────────────────────────────────────────────
PASOS (una sola configuración):

1) Cierra TODAS las ventanas de Chrome.

2) Lanza Chrome con el puerto de depuración abierto (usa tu perfil normal):

     google-chrome \
       --remote-debugging-port=9222 \
       --user-data-dir="$HOME/.config/google-chrome"

   (En algunos sistemas el binario es `google-chrome-stable`.)

3) En ESE Chrome, entra una vez a:
     https://www.cma-cgm.com/ebusiness/tracking/detail/CMAU0863618
   Resuelve el captcha de DataDome si aparece. Ya estás "dentro".

4) Deja ese Chrome abierto y ejecuta el scraper:
     python3 scripts/scrape-cma-v2.py CMAU0863618

   El script abre una pestaña nueva en TU Chrome, navega al contenedor,
   lee la ETA y cierra la pestaña. DataDome lo ve como navegación humana.
──────────────────────────────────────────────────────────────────────────

Extracción (HTML real de la página de detalle):
    <span class="capsule primary-dark">Arrived at POD</span>
    <p><span>Sat 06-JUN-2026</span><span class="...ico-time">02:33 PM</span></p>

Variables de entorno:
  CMA_DEBUG_ADDRESS=127.0.0.1:9222   -> dirección del Chrome con debug abierto

Salida (stdout): JSON {"eta": "2026-06-06", "raw": "Sat 06-JUN-2026", ...}
"""

import sys
import os
import json
import time
import re

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

MONTHS = {
    "JAN": "01", "FEB": "02", "MAR": "03", "APR": "04",
    "MAY": "05", "JUN": "06", "JUL": "07", "AUG": "08",
    "SEP": "09", "OCT": "10", "NOV": "11", "DEC": "12",
}

EXTRACT_JS = r"""
const results = [];
document.querySelectorAll('.capsule').forEach(cap => {
    const status = (cap.textContent || '').trim();
    let dateText = '';
    const container = cap.closest('li, div, td, tr') || cap.parentElement;
    if (container) {
        const p = container.querySelector('p');
        if (p) {
            const span = p.querySelector('span');
            if (span) dateText = (span.textContent || '').trim();
        }
    }
    results.push({ status, date: dateText });
});
return results;
"""


def parse_cma_date(raw: str):
    """'Sat 06-JUN-2026' o '06-JUN-2026' -> '2026-06-06'"""
    if not raw:
        return None
    m = re.search(r"(\d{1,2})-([A-Za-z]{3})-(\d{4})", raw)
    if not m:
        return None
    day = m.group(1).zfill(2)
    mon = MONTHS.get(m.group(2).upper())
    year = m.group(3)
    if not mon:
        return None
    return f"{year}-{mon}-{day}"


def pick_best_event(events):
    """Elige el evento de llegada al POD (destino final)."""
    dated = [e for e in events if parse_cma_date(e.get("date", ""))]
    if not dated:
        return None
    for e in dated:
        s = e["status"].lower()
        if "pod" in s and "arriv" in s:
            return e
    for e in dated:
        if "pod" in e["status"].lower():
            return e
    for e in dated:
        s = e["status"].lower()
        if "arriv" in s or "discharg" in s:
            return e
    return dated[-1]


def attach_driver():
    """Conecta a un Chrome ya abierto con --remote-debugging-port."""
    debug_addr = os.environ.get("CMA_DEBUG_ADDRESS", "127.0.0.1:9222")
    options = Options()
    options.add_experimental_option("debuggerAddress", debug_addr)
    print(f"[CMA] Conectando a Chrome real en {debug_addr}...", file=sys.stderr)
    # Selenium Manager descarga el chromedriver correcto automáticamente.
    return webdriver.Chrome(options=options)


def scrap_cma(container: str):
    try:
        driver = attach_driver()
    except Exception as e:
        msg = str(e)[:200]
        print(f"[CMA] No se pudo conectar a Chrome: {msg}", file=sys.stderr)
        return {
            "eta": None,
            "raw": None,
            "status": "no_chrome",
            "hint": "Lanza Chrome con --remote-debugging-port=9222 (ver cabecera del script).",
            "error": msg,
        }

    # Reutilizamos la pestaña activa de tu Chrome (más robusto que abrir/cerrar
    # pestañas, que deja al driver sin ventana activa = "no such window").
    try:
        handles = driver.window_handles
        if handles:
            driver.switch_to.window(handles[-1])
    except Exception:
        pass

    try:
        url = f"https://www.cma-cgm.com/ebusiness/tracking/detail/{container}"
        print(f"[CMA] Loading: {url}", file=sys.stderr)
        driver.get(url)

        deadline = time.time() + 30
        events = []
        blocked = False
        while time.time() < deadline:
            html = driver.page_source or ""
            blocked = "captcha-delivery.com" in html
            try:
                events = driver.execute_script(EXTRACT_JS) or []
            except Exception:
                events = []
            if events and not blocked:
                break
            if blocked:
                print("[CMA] DataDome challenge present (resuélvelo en Chrome)...", file=sys.stderr)
            time.sleep(2)

        if not events:
            return {
                "eta": None,
                "raw": None,
                "status": "blocked_datadome" if blocked else "no_data",
            }

        best = pick_best_event(events)
        if not best:
            return {"eta": None, "raw": None, "status": "no_date", "events": events}

        eta = parse_cma_date(best["date"])
        return {
            "eta": eta,
            "raw": best["date"],
            "event_status": best["status"],
            "status": "success" if eta else "no_date",
        }
    except Exception as e:
        print(f"[CMA] Error: {str(e)[:200]}", file=sys.stderr)
        return {"eta": None, "raw": None, "status": "error", "error": str(e)[:200]}


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(json.dumps({"error": "Missing container number"}))
        sys.exit(1)

    container = sys.argv[1].strip().upper()
    print(f"[CMA] Starting scraper for: {container}", file=sys.stderr)
    result = scrap_cma(container)
    result["container"] = container
    print(json.dumps(result))
