import base64
import hashlib
import hmac
import json
import time
from urllib.parse import urlsplit


def crear_token(url, secreto, duracion=300):
    datos = {
        "url": url,
        "exp": int(time.time()) + duracion
    }

    contenido = json.dumps(
        datos,
        separators=(",", ":")
    ).encode("utf-8")

    firma = hmac.new(
        secreto,
        contenido,
        hashlib.sha256
    ).digest()

    token = base64.urlsafe_b64encode(
        contenido + firma
    ).decode("ascii").rstrip("=")

    return token


def verificar_token(token, secreto):
    relleno = "=" * (-len(token) % 4)

    bruto = base64.urlsafe_b64decode(
        token + relleno
    )

    if len(bruto) < 33:
        raise ValueError("Token invalido")

    contenido = bruto[:-32]
    firma = bruto[-32:]

    esperada = hmac.new(
        secreto,
        contenido,
        hashlib.sha256
    ).digest()

    if not hmac.compare_digest(firma, esperada):
        raise ValueError("Firma invalida")

    datos = json.loads(contenido)

    if int(datos["exp"]) < time.time():
        raise ValueError("Token expirado")

    return datos["url"]
