"""Выдача LiveKit access-токенов участникам конференции."""

from datetime import timedelta

from livekit import api

from core.config import get_settings

TOKEN_TTL = timedelta(hours=6)


def create_room_access_token(
    *, room_name: str, identity: str, name: str, metadata: str | None = None
) -> str:
    """Создать JWT access-токен LiveKit для входа участника в комнату.

    `identity` — произвольная строка identity, используемая webhook-
    обработчиками (`services.webhook_handlers`) для сопоставления треков с
    участником: `str(user_id)` для зарегистрированного пользователя,
    `guest:{guest_access.id}` для гостя (ADR-001, п.6). `name` — отображаемое
    имя, показывается клиентским UI. `metadata` — произвольная строка
    (JSON), доступная клиенту как `participant.metadata` — используется
    для аватара при выключенной камере; `None` (гость либо пользователь
    без аватара) — метаданные не выставляются вовсе.
    """
    settings = get_settings()
    token = (
        api.AccessToken(settings.livekit_api_key, settings.livekit_api_secret)
        .with_identity(identity)
        .with_name(name)
        .with_grants(
            api.VideoGrants(
                room_join=True,
                room=room_name,
                can_publish=True,
                can_subscribe=True,
            )
        )
        .with_ttl(TOKEN_TTL)
    )
    if metadata is not None:
        token = token.with_metadata(metadata)
    return token.to_jwt()
