"""
Integration Tests — Conftest.

فیکسچرهای اختصاصی تست‌های یکپارچگی.
"""
import pytest
from django.test import override_settings
from rest_framework.test import APIClient

from apps.core.tenant.models import Tenant, Domain


@pytest.fixture
def tenant(db):
    """Create or get the test tenant (idempotent for --reuse-db)."""
    tenant, created = Tenant.objects.get_or_create(
        schema_name='public',
        defaults={
            'name': 'تست یکپارچگی',
            'slug': 'integration-test',
        },
    )
    Domain.objects.get_or_create(
        domain='localhost',
        tenant=tenant,
        defaults={'is_primary': True},
    )
    return tenant


@pytest.fixture
def api_client():
    """API client with default headers for tenant middleware."""
    return APIClient(
        HTTP_HOST='localhost',
        SERVER_NAME='localhost',
    )


@pytest.fixture
def user_factory(tenant):
    """Factory to create test users."""
    from apps.core.auth.models import User

    def _create_user(
        email='test@example.com',
        password='TestPass123!',
        first_name='تست',
        last_name='کاربر',
        is_staff=False,
        **kwargs,
    ):
        user = User.objects.create_user(
            email=email,
            password=password,
            first_name=first_name,
            last_name=last_name,
            is_staff=is_staff,
            tenant=tenant,
            **kwargs,
        )
        return user

    return _create_user


@pytest.fixture
def authenticated_client(api_client, user_factory):
    """Client with authenticated user."""
    from rest_framework_simplejwt.tokens import RefreshToken

    user = user_factory()
    refresh = RefreshToken.for_user(user)
    api_client.credentials(
        HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}'
    )
    return api_client, user


@pytest.fixture
def process_definition(tenant):
    """Create a test workflow process definition."""
    from apps.services.workflow.models import ProcessDefinition

    return ProcessDefinition.objects.create(
        tenant=tenant,
        name='فرآیند تست یکپارچگی',
        slug='integration-test-process',
        bpmn_xml='<definitions></definitions>',
        version=1,
        is_deployed=True,
    )


@pytest.fixture
def worktable_table(tenant):
    """Create a test worktable table."""
    from apps.services.worktable.models import Table

    return Table.objects.create(
        tenant=tenant,
        name='جدول تست',
        slug='test-table',
        enable_audit=True,
    )
