# retoor <retoor@molodetz.nl>

import uuid
import requests
from tests.conftest import BASE_URL
def _session_push():
    s = requests.Session()
    name = f"push_{uuid.uuid4().hex[:10]}"
    s.post(
        f"{BASE_URL}/auth/signup",
        data={
            "username": name,
            "email": f"{name}@test.dev",
            "password": "secret123",
            "confirm_password": "secret123",
            "birth_date": "1990-01-01",
            "accept_terms": "1",
        },
        allow_redirects=True,
    )
    return s


def test_public_key_endpoint(app_server):
    r = requests.get(f"{BASE_URL}/push.json")
    assert r.status_code == 200
    assert r.json().get("publicKey")


def test_register_requires_auth(app_server):
    r = requests.post(
        f"{BASE_URL}/push.json",
        json={
            "endpoint": "https://push.example.com/anon",
            "keys": {"p256dh": "key", "auth": "auth"},
        },
        allow_redirects=False,
    )
    assert r.status_code == 401


def test_register_success(app_server):
    s = _session_push()
    r = s.post(
        f"{BASE_URL}/push.json",
        json={
            "endpoint": "https://push.example.com/sub-1",
            "keys": {"p256dh": "p256dh_fake", "auth": "auth_fake"},
        },
    )
    assert r.status_code == 200, r.text
    assert r.json().get("registered") is True


def test_register_missing_keys_rejected(app_server):
    s = _session_push()
    r = s.post(f"{BASE_URL}/push.json", json={"endpoint": "https://push.example.com/x"})
    assert r.status_code == 400


def test_register_invalid_json_rejected(app_server):
    s = _session_push()
    r = s.post(
        f"{BASE_URL}/push.json",
        data="not-json",
        headers={"Content-Type": "application/json"},
    )
    assert r.status_code == 400


def test_public_key_endpoint_lists_providers(app_server):
    r = requests.get(f"{BASE_URL}/push.json")
    assert r.status_code == 200
    body = r.json()
    assert body["publicKey"]
    assert body["providers"]["webpush"]["publicKey"] == body["publicKey"]


def test_register_accepts_an_explicit_webpush_provider(app_server):
    s = _session_push()
    r = s.post(
        f"{BASE_URL}/push.json",
        json={
            "provider": "webpush",
            "endpoint": "https://push.example.com/explicit",
            "keys": {"p256dh": "p256dh_fake", "auth": "auth_fake"},
        },
    )
    assert r.status_code == 200, r.text
    assert r.json().get("registered") is True


def test_register_is_idempotent_for_the_same_subscription(app_server):
    s = _session_push()
    body = {
        "endpoint": "https://push.example.com/idempotent",
        "keys": {"p256dh": "p256dh_fake", "auth": "auth_fake"},
    }
    assert s.post(f"{BASE_URL}/push.json", json=body).status_code == 200
    assert s.post(f"{BASE_URL}/push.json", json=body).status_code == 200


def test_register_unknown_provider_rejected(app_server):
    s = _session_push()
    r = s.post(
        f"{BASE_URL}/push.json",
        json={"provider": "carrier-pigeon", "token": "a" * 64},
    )
    assert r.status_code == 400


def test_register_apns_rejected_while_unconfigured(app_server):
    s = _session_push()
    r = s.post(f"{BASE_URL}/push.json", json={"provider": "apns", "token": "a" * 64})
    assert r.status_code == 400


def test_register_non_object_body_rejected(app_server):
    s = _session_push()
    r = s.post(f"{BASE_URL}/push.json", json=["nope"])
    assert r.status_code == 400


def test_register_ignores_client_id_on_webpush(app_server):
    s = _session_push()
    r = s.post(
        f"{BASE_URL}/push.json",
        json={
            "endpoint": "https://push.example.com/with-client",
            "keys": {"p256dh": "p256dh_fake", "auth": "auth_fake"},
            "client_id": "browser-tab",
        },
    )
    assert r.status_code == 200, r.text
    assert r.json().get("registered") is True
