"""Tests for email verification endpoints."""

import pytest
from httpx import AsyncClient


@pytest.mark.asyncio
class TestEmailVerification:
    """Test email verification send + verify flow."""

    async def test_send_verification(self, client: AsyncClient, auth_headers: dict):
        """Send verification email returns 200."""
        response = await client.post(
            "/api/v1/auth/email/send-verification",
            headers=auth_headers,
        )
        assert response.status_code == 200
        assert "sent" in response.json()["message"].lower()

    async def test_send_verification_already_verified(
        self, client: AsyncClient, auth_headers: dict, test_db
    ):
        """Returns 400 if email is already verified."""
        from sqlalchemy import select, update
        from datetime import datetime, timezone
        from app.models.user import User

        # Manually mark email as verified
        await test_db.execute(
            update(User).where(User.email == "test@example.com").values(
                email_verified_at=datetime.now(timezone.utc)
            )
        )
        await test_db.commit()

        response = await client.post(
            "/api/v1/auth/email/send-verification",
            headers=auth_headers,
        )
        assert response.status_code == 400
        assert "already verified" in response.json()["detail"].lower()

    async def test_verify_invalid_token(self, client: AsyncClient):
        """Invalid token returns 400."""
        response = await client.post(
            "/api/v1/auth/email/verify",
            json={"token": "invalid-token"},
        )
        assert response.status_code == 400

    async def test_verify_missing_token(self, client: AsyncClient):
        """Missing token returns 400."""
        response = await client.post(
            "/api/v1/auth/email/verify",
            json={},
        )
        assert response.status_code == 400
