"""
Утилиты для работы с реферальными ссылками.

Генерация и декодирование происходит локально,
без обращения к GlobalAuth API.

Example:
    from opengater_globalauth_client.utils import generate_referral_link

    link = generate_referral_link(
        user_id="4a86a7f5-99f0-42c1-8f34-5410be276d51",
        public_url="https://lk.bot.eutochkin.com/user/balance",
    )
    # https://lk.bot.eutochkin.com/user/balanceref_eyJ0IjoiciIsInUiOi...
"""
import json
import base64


def _encode_payload(payload: dict) -> str:
    """Кодирование payload в base64url"""
    json_str = json.dumps(payload, separators=(",", ":"))
    return base64.urlsafe_b64encode(json_str.encode()).decode().rstrip("=")


def _decode_payload(encoded: str) -> dict | None:
    """Декодирование payload из base64url"""
    try:
        padding = 4 - len(encoded) % 4
        if padding != 4:
            encoded += "=" * padding
        json_str = base64.urlsafe_b64decode(encoded).decode()
        return json.loads(json_str)
    except Exception:
        return None


def generate_referral_code(user_id: str) -> str:
    """
    Генерация реферального кода.

    Args:
        user_id: UUID пользователя (globalauth_id)

    Returns:
        Код вида ref_eyJ0Ijoi...
    """
    payload = {"t": "r", "u": str(user_id)}
    return "ref_" + _encode_payload(payload)


def generate_event_code(event_id: str, service_slug: str) -> str:
    """
    Генерация кода события.

    Args:
        event_id: ID события
        service_slug: Slug сервиса

    Returns:
        Код вида evt_eyJ0Ijoi...
    """
    payload = {"t": "e", "e": event_id, "s": service_slug}
    return "evt_" + _encode_payload(payload)


def generate_referral_link(user_id: str, public_url: str) -> str:
    """
    Генерация полной реферальной ссылки.

    Args:
        user_id: UUID пользователя (globalauth_id)
        public_url: Базовый URL сервиса (например https://lk.bot.eutochkin.com/user/balance)

    Returns:
        Полная ссылка
    """
    return f"{public_url}{generate_referral_code(user_id)}"


def generate_event_link(event_id: str, service_slug: str, public_url: str) -> str:
    """
    Генерация полной ссылки события.

    Args:
        event_id: ID события
        service_slug: Slug сервиса
        public_url: Базовый URL сервиса

    Returns:
        Полная ссылка
    """
    return f"{public_url}{generate_event_code(event_id, service_slug)}"


def decode_code(code: str) -> dict | None:
    """
    Декодирование реферального кода или кода события.

    Args:
        code: Код из ссылки (ref_xxx или evt_xxx)

    Returns:
        {"type": "referral", "inviter_id": "uuid"} или
        {"type": "event", "event_id": "...", "service_slug": "..."} или
        None
    """
    if code.startswith("ref_"):
        payload = _decode_payload(code[4:])
        if payload and payload.get("t") == "r" and "u" in payload:
            return {"type": "referral", "inviter_id": payload["u"]}

    elif code.startswith("evt_"):
        payload = _decode_payload(code[4:])
        if payload and payload.get("t") == "e" and "e" in payload and "s" in payload:
            return {"type": "event", "event_id": payload["e"], "service_slug": payload["s"]}

    return None
