"""
Revisa el catálogo contra Mercado Libre: actualiza el precio si cambió
y desactiva los productos que se agotaron o se dieron de baja.

Pensado para correr una vez al día por cron, no como proceso continuo.

Uso:
    python verificar_precios.py
"""
import sys
import time

import requests

import database as db
import ml_auth

DRY_RUN = "--dry-run" in sys.argv

CABECERAS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}


def verificar_producto(p, access_token):
    # OJO: el ID de Mercado Libre NO se resuelve siguiendo el link de
    # afiliado — esos links acortados redirigen a una página genérica de
    # Mercado Libre (pensada para abrir la app) que no tiene el producto
    # real. Por eso acá solo se usa el ml_item_id cargado a mano desde el
    # panel o add_producto.py.
    item_id = p.get("ml_item_id")
    if not item_id:
        print(f"[{p['id']}] '{p['titulo'][:40]}' no tiene ID de Mercado Libre cargado, lo salteo "
              f"(agregalo desde el panel, editando el producto).")
        return

    cabeceras_api = {**CABECERAS, "Authorization": f"Bearer {access_token}"}
    try:
        resp = requests.get(f"https://api.mercadolibre.com/items/{item_id}", timeout=15, headers=cabeceras_api)
    except requests.RequestException as e:
        print(f"[{p['id']}] Error de conexión: {e}")
        return

    if resp.status_code == 404:
        print(f"[{p['id']}] Ya no existe en Mercado Libre, lo desactivo.")
        if not DRY_RUN:
            db.actualizar_desde_ml(p["id"], activo=False, ml_item_id=item_id)
        return

    if resp.status_code != 200:
        print(f"[{p['id']}] Mercado Libre respondió {resp.status_code} para {item_id}: {resp.text[:300]}")
        return

    datos = resp.json()

    # Si la respuesta no trae los campos que esperamos, no adivinamos nada:
    # mejor dejar el producto como está que desactivarlo por las dudas.
    if "status" not in datos or "available_quantity" not in datos:
        print(f"[{p['id']}] Respuesta inesperada de Mercado Libre, lo dejo como está: {resp.text[:400]}")
        return

    disponible = datos["status"] == "active" and datos["available_quantity"] > 0
    precio_nuevo = datos.get("price")

    print(f"[{p['id']}] '{p['titulo'][:40]}' -> status={datos['status']}, "
          f"stock={datos['available_quantity']}, precio_ml=${precio_nuevo}, precio_db=${p['precio']}")

    cambios = {}
    if not disponible:
        cambios["activo"] = False
        print(f"    => se desactiva (agotado/pausado)")
    elif precio_nuevo is not None and float(precio_nuevo) != float(p["precio"]):
        cambios["precio"] = precio_nuevo
        print(f"    => precio actualizado: ${p['precio']} -> ${precio_nuevo}")

    if DRY_RUN:
        return

    db.actualizar_desde_ml(p["id"], ml_item_id=item_id, **cambios)


def main():
    db.init_db()

    access_token = ml_auth.obtener_token_valido()
    if not access_token:
        print("Todavía no conectaste tu cuenta de Mercado Libre. Entrá al panel y "
              "conectala en la sección 'Mercado Libre' antes de correr esto.")
        return

    productos = db.listar_todos_activos()
    print(f"Verificando {len(productos)} productos activos...{' (DRY RUN, no se guarda nada)' if DRY_RUN else ''}")
    for p in productos:
        verificar_producto(p, access_token)
        time.sleep(0.3)
    print("Listo.")


if __name__ == "__main__":
    main()
