import secrets
import time
from threading import Lock


class HLSRegistryV2:
    def __init__(self, ttl=120, max_recursos=10000):
        self.ttl = ttl
        self.max_recursos = max_recursos
        self.recursos = {}
        self.identidades = {}
        self.lock = Lock()

    def _limpiar(self):
        ahora = time.time()

        expirados = [
            identificador
            for identificador, recurso in self.recursos.items()
            if ahora >= recurso["exp"]
        ]

        for identificador in expirados:
            recurso = self.recursos.pop(identificador)

            identidad = recurso["identidad"]

            if self.identidades.get(identidad) == identificador:
                del self.identidades[identidad]

    def registrar(self, url, identidad):
        if not identidad:
            raise ValueError("Identidad HLS requerida")

        with self.lock:
            self._limpiar()

            existente = self.identidades.get(identidad)

            if existente and existente in self.recursos:
                recurso = self.recursos[existente]

                recurso["url"] = url
                recurso["exp"] = time.time() + self.ttl

                return existente

            if len(self.recursos) >= self.max_recursos:
                raise RuntimeError("Limite HLS alcanzado")

            identificador = secrets.token_urlsafe(24)

            self.recursos[identificador] = {
                "url": url,
                "identidad": identidad,
                "exp": time.time() + self.ttl
            }

            self.identidades[identidad] = identificador

            return identificador

    def resolver(self, identificador):
        with self.lock:
            recurso = self.recursos.get(identificador)

            if not recurso:
                raise ValueError("Recurso desconocido")

            if time.time() >= recurso["exp"]:
                raise ValueError("Recurso expirado")

            return recurso["url"]

    def limpiar(self):
        with self.lock:
            self._limpiar()
