"""Tests for session-backed authentication routes."""


class TestAuthRoutes:
    def test_csrf_bootstrap_returns_token(self, client):
        response = client.get('/api/auth/csrf')

        assert response.status_code == 200
        assert isinstance(response.get_json()['csrf_token'], str)
        assert response.get_json()['csrf_token']

    def test_register_success(self, client):
        response = client.post(
            '/api/auth/register',
            json={'email': 'user@example.com', 'password': 'secretpass123'},
        )

        assert response.status_code == 201
        data = response.get_json()
        assert data['user']['email'] == 'user@example.com'
        assert data['user']['plan'] == 'free'
        assert data['user']['role'] == 'user'

    def test_register_assigns_admin_role_for_allowlisted_email(self, app, client):
        app.config['INTERNAL_ADMIN_EMAILS'] = ('admin@example.com',)

        response = client.post(
            '/api/auth/register',
            json={'email': 'admin@example.com', 'password': 'secretpass123'},
        )

        assert response.status_code == 201
        assert response.get_json()['user']['role'] == 'admin'

    def test_register_duplicate_email(self, client):
        client.post(
            '/api/auth/register',
            json={'email': 'user@example.com', 'password': 'secretpass123'},
        )
        response = client.post(
            '/api/auth/register',
            json={'email': 'user@example.com', 'password': 'secretpass123'},
        )

        assert response.status_code == 409
        assert 'already exists' in response.get_json()['error'].lower()

    def test_login_and_me(self, client):
        client.post(
            '/api/auth/register',
            json={'email': 'user@example.com', 'password': 'secretpass123'},
        )
        client.post('/api/auth/logout')

        login_response = client.post(
            '/api/auth/login',
            json={'email': 'user@example.com', 'password': 'secretpass123'},
        )
        me_response = client.get('/api/auth/me')

        assert login_response.status_code == 200
        assert me_response.status_code == 200
        me_data = me_response.get_json()
        assert me_data['authenticated'] is True
        assert me_data['user']['email'] == 'user@example.com'

    def test_login_invalid_password(self, client):
        client.post(
            '/api/auth/register',
            json={'email': 'user@example.com', 'password': 'secretpass123'},
        )
        client.post('/api/auth/logout')

        response = client.post(
            '/api/auth/login',
            json={'email': 'user@example.com', 'password': 'wrongpass123'},
        )

        assert response.status_code == 401
        assert 'invalid email or password' in response.get_json()['error'].lower()

    def test_me_without_session(self, client):
        response = client.get('/api/auth/me')

        assert response.status_code == 200
        assert response.get_json() == {'authenticated': False, 'user': None}

    def test_register_rejects_invalid_csrf_token(self, client):
        response = client.post(
            '/api/auth/register',
            json={'email': 'csrf@example.com', 'password': 'secretpass123'},
            headers={'X-CSRF-Token': 'invalid-token'},
        )

        assert response.status_code == 403
        assert 'csrf' in response.get_json()['error'].lower()
