"""
Manejo de autenticación OAuth con la API de Mercado Libre: guarda y
renueva el access_token automáticamente usando el refresh_token.

La conexión inicial (autorizar la app una vez) se hace desde el panel
(panel/mercadolibre.php); acá solo se lee y renueva lo que ya se guardó
en la base.
"""
from datetime import datetime, timedelta

import requests

import database as db
from config import MELI_APP_ID, MELI_SECRET_KEY

URL_TOKEN = "https://api.mercadolibre.com/oauth/token"


def obtener_token_valido():
    """Devuelve un access_token vigente, renovándolo si está por vencer.
    Devuelve None si todavía no se conectó la cuenta de Mercado Libre."""
    tokens = db.obtener_tokens_ml()
    if not tokens:
        return None

    margen = timedelta(minutes=5)
    if tokens["expira_en"] > datetime.utcnow() + margen:
        return tokens["access_token"]

    return _renovar(tokens["refresh_token"])


def _renovar(refresh_token):
    resp = requests.post(URL_TOKEN, data={
        "grant_type": "refresh_token",
        "client_id": MELI_APP_ID,
        "client_secret": MELI_SECRET_KEY,
        "refresh_token": refresh_token,
    }, timeout=15)

    if resp.status_code != 200:
        print(f"No pude renovar el token de Mercado Libre: {resp.status_code} {resp.text[:200]}")
        return None

    datos = resp.json()
    expira_en = datetime.utcnow() + timedelta(seconds=datos["expires_in"])
    db.guardar_tokens_ml(datos["access_token"], datos["refresh_token"], expira_en)
    return datos["access_token"]
