import os
import sys
import time
from pathlib import Path

# Playwright maneja internamente la configuración de asyncio
from playwright.sync_api import sync_playwright

CER_PATH = os.getenv("SAT_CER_PATH")
KEY_PATH = os.getenv("SAT_KEY_PATH")
KEY_PASSWORD = os.getenv("SAT_KEY_PASSWORD")
RFC = os.getenv("SAT_RFC")
HEADLESS = os.getenv("PLAYWRIGHT_HEADLESS", "1") != "0"

SAT_LOGIN_URL = "https://login.mat.sat.gob.mx/"  # o la URL de acceso por e.firma

def safe_path(p):
    if p is None:
        raise RuntimeError("No se definió la variable de entorno para el archivo (.cer/.key).")
    p = Path(p)
    if not p.exists():
        raise RuntimeError(f"Archivo no encontrado: {p}")
    return str(p)

def run():
    print("\n=== VARIABLES DE ENTORNO RECIBIDAS ===")

    print(f"RFC: {RFC}")
    print(f"CER_PATH: {CER_PATH}")
    print(f"KEY_PATH: {KEY_PATH}")
    print(f"KEY_PASSWORD: {'*' * len(KEY_PASSWORD) if KEY_PASSWORD else 'None'}")
    print(f"HEADLESS: {HEADLESS}")

    try:
        cer = safe_path(CER_PATH)
        key = safe_path(KEY_PATH)
        print(f"Archivos encontrados - CER: {cer}, KEY: {key}")
    except RuntimeError as e:
        print(f"ERROR: {e}")
        return {"error": str(e)}
    

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=HEADLESS)
        context = browser.new_context()
        page = context.new_page()

        page.goto(SAT_LOGIN_URL, wait_until="domcontentloaded")
        page.set_input_files('input[type="file"]#fileCertificate', cer)
        page.set_input_files('input[type="file"]#filePrivateKey', cer)
        page.fill('input[id="privateKeyPassword"]', KEY_PASSWORD or "")

        time.sleep(4)  # Espera 4 segundos antes de hacer clic
        # Click en el botón "Enviar" con id="submit"
        page.click('input#submit.btn.btn-primary[type="button"]')

        # Esperar a navegación/post-login
        try:
            page.wait_for_load_state("networkidle", timeout=15000)
        except Exception:
            # puede que haya redirección lenta o captcha; continúa y toma screenshot para debug
            pass

        time.sleep(4)  # Espera 4 segundos antes de hacer clic

        # Guardar screenshot de depuración (NO contiene tus archivos .key/.cer si quieres)
        page.screenshot(path="sat_login_screenshot.png", full_page=True)

        # Extraer algún texto o confirmar login
        content = page.content()
        # aquí devuelves algo útil (ejemplo: si aparece un selector propio del área privada)
        # ejemplo: buscar un elemento que solo aparece si estás dentro
        is_logged = False
        try:
            is_logged = page.locator('text=Mi cuenta, Mis trámites, Buzón Tributario').first.count() > 0
        except Exception:
            is_logged = False

        browser.close()
        return {"logged": is_logged, "snapshot": "sat_login_screenshot.png"}

if __name__ == "__main__":
    r = run()
    print(r)
