"""Authentication endpoint tests."""
import pytest
from httpx import AsyncClient


@pytest.mark.asyncio
async def test_login_success(client: AsyncClient, test_admin_user, test_account):
    response = await client.post(
        "/api/v1/auth/login",
        json={"email": "admin@testcemetery.com", "password": "TestPassword123"},
        headers={"X-Tenant-ID": str(test_account.id)},
    )
    assert response.status_code == 200
    data = response.json()
    assert data["success"] is True
    assert "access_token" in data["data"]
    assert "refresh_token" in data["data"]
    assert data["data"]["user"]["role"] == "administrator"


@pytest.mark.asyncio
async def test_login_wrong_password(client: AsyncClient, test_admin_user, test_account):
    response = await client.post(
        "/api/v1/auth/login",
        json={"email": "admin@testcemetery.com", "password": "WrongPassword"},
        headers={"X-Tenant-ID": str(test_account.id)},
    )
    assert response.status_code == 401
    assert response.json()["success"] is False


@pytest.mark.asyncio
async def test_get_me(client: AsyncClient, auth_headers):
    response = await client.get("/api/v1/auth/me", headers=auth_headers)
    assert response.status_code == 200
    data = response.json()
    assert data["success"] is True
    assert data["data"]["email"] == "admin@testcemetery.com"


@pytest.mark.asyncio
async def test_get_me_unauthenticated(client: AsyncClient):
    response = await client.get("/api/v1/auth/me")
    assert response.status_code == 401


@pytest.mark.asyncio
async def test_refresh_token(client: AsyncClient, test_admin_user, test_account):
    # Login first
    login_resp = await client.post(
        "/api/v1/auth/login",
        json={"email": "admin@testcemetery.com", "password": "TestPassword123"},
        headers={"X-Tenant-ID": str(test_account.id)},
    )
    refresh_token = login_resp.json()["data"]["refresh_token"]

    # Refresh
    response = await client.post(
        "/api/v1/auth/refresh",
        json={"refresh_token": refresh_token},
    )
    assert response.status_code == 200
    assert "access_token" in response.json()["data"]


@pytest.mark.asyncio
async def test_logout(client: AsyncClient, test_admin_user, test_account):
    login_resp = await client.post(
        "/api/v1/auth/login",
        json={"email": "admin@testcemetery.com", "password": "TestPassword123"},
        headers={"X-Tenant-ID": str(test_account.id)},
    )
    refresh_token = login_resp.json()["data"]["refresh_token"]

    response = await client.post(
        "/api/v1/auth/logout",
        json={"refresh_token": refresh_token},
    )
    assert response.status_code == 204
