import base64
import json

import pytest

from app.integrations.base import InvalidTokenError
from app.integrations.registry import AdapterRegistry
from tests.fakes import make_helixtahr_adapter
from tests.tokens import MISSING, meeting_token

registry = AdapterRegistry([make_helixtahr_adapter()])


def _hand_built(payload: dict[str, object]) -> str:
    """A token PyJWT would refuse to sign (e.g. a non-string `iss`); signature is junk."""

    def part(data: dict[str, object]) -> str:
        return base64.urlsafe_b64encode(json.dumps(data).encode()).rstrip(b"=").decode()

    return f"{part({'alg': 'HS256', 'typ': 'JWT'})}.{part(payload)}.c2ln"


def test_token_goes_to_the_adapter_for_its_issuer():
    assert registry.verify_token(meeting_token()).product == "helixtahr"


@pytest.mark.parametrize("iss", ["https://unknown.test/login", MISSING])
def test_unknown_or_missing_issuer_is_rejected(iss):
    with pytest.raises(InvalidTokenError):
        registry.verify_token(meeting_token(iss=iss))


@pytest.mark.parametrize("iss", [["a"], 1, None])
def test_non_string_issuer_is_rejected(iss):
    with pytest.raises(InvalidTokenError):
        registry.verify_token(_hand_built({"iss": iss, "sub": "1"}))


@pytest.mark.parametrize("raw", ["", "abc", "a.b.c"])
def test_malformed_token_is_rejected(raw):
    with pytest.raises(InvalidTokenError):
        registry.verify_token(raw)
