"""
Конфигурация pytest для всего проекта.
Содержит фикстуры, доступные во всех тестах.
"""
import pytest
from django.contrib.auth import get_user_model
from rest_framework.test import APIClient
from rest_framework_simplejwt.tokens import RefreshToken

User = get_user_model()


@pytest.fixture
def api_client():
    """REST API клиент для тестов."""
    return APIClient()


@pytest.fixture
def mentor_user(db):
    """Создает пользователя-ментора для тестов."""
    user = User.objects.create_user(
        email='mentor@test.com',
        password='TestPass123!',
        first_name='Иван',
        last_name='Иванов',
        phone='+79991234567',
        role='mentor',
        is_email_verified=True,
        is_active=True
    )
    return user


@pytest.fixture
def client_user(db):
    """Создает пользователя-клиента для тестов."""
    user = User.objects.create_user(
        email='client@test.com',
        password='TestPass123!',
        first_name='Петр',
        last_name='Петров',
        phone='+79991234568',
        role='client',
        is_email_verified=True,
        is_active=True
    )
    return user


@pytest.fixture
def parent_user(db):
    """Создает пользователя-родителя для тестов."""
    user = User.objects.create_user(
        email='parent@test.com',
        password='TestPass123!',
        first_name='Мария',
        last_name='Сидорова',
        phone='+79991234569',
        role='parent',
        is_email_verified=True,
        is_active=True
    )
    return user


@pytest.fixture
def authenticated_client(api_client, mentor_user):
    """API клиент с аутентификацией (ментор)."""
    refresh = RefreshToken.for_user(mentor_user)
    api_client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
    api_client.user = mentor_user
    return api_client


@pytest.fixture
def authenticated_client_user(api_client, client_user):
    """API клиент с аутентификацией (клиент)."""
    refresh = RefreshToken.for_user(client_user)
    api_client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
    api_client.user = client_user
    return api_client


@pytest.fixture
def authenticated_parent(api_client, parent_user):
    """API клиент с аутентификацией (родитель)."""
    refresh = RefreshToken.for_user(parent_user)
    api_client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
    api_client.user = parent_user
    return api_client


@pytest.fixture
def tokens_for_user():
    """Функция для генерации JWT токенов для пользователя."""
    def _get_tokens(user):
        refresh = RefreshToken.for_user(user)
        return {
            'refresh': str(refresh),
            'access': str(refresh.access_token),
        }
    return _get_tokens

