import uuid
from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)


def create_user(username, password):
    return client.post("/users", json={"username": username, "password": password})


def login(username, password):
    return client.post("/token", data={"username": username, "password": password})


def test_register_login_logout():
    username = f"testuser_{uuid.uuid4().hex[:8]}"
    password = "Testpass123!"

    r = create_user(username, password)
    assert r.status_code in (200, 201)

    r = login(username, password)
    assert r.status_code == 200
    token = r.json().get("access_token")
    assert token

    headers = {"Authorization": f"Bearer {token}"}
    r = client.get("/users/me", headers=headers)
    assert r.status_code == 200

    # Logout should revoke the token
    r = client.post("/logout", headers=headers)
    assert r.status_code == 204

    # Token should no longer be valid
    r = client.get("/users/me", headers=headers)
    assert r.status_code == 401


def test_lockout_after_failed_attempts():
    username = f"lockout_{uuid.uuid4().hex[:8]}"
    password = "goodpass123"

    r = create_user(username, password)
    assert r.status_code in (200, 201)

    # 4 failed attempts -> 401, 5th -> 403 (locked)
    for i in range(4):
        r = login(username, "wrongpassword")
        assert r.status_code == 401
    r = login(username, "wrongpassword")
    assert r.status_code == 403
