"""
Worktable Tests - Pytest Configuration.
"""
import pytest
from django.db import transaction

from apps.core.tenant.models import Tenant, Domain
from apps.core.auth.models import User
from apps.services.worktable.models import (
    TableDefinition,
    TableColumn,
    TableRecord,
    FieldType,
    RecordStatus,
)


@pytest.fixture(scope='function')
def tenant(db):
    """Create a test tenant with domain."""
    with transaction.atomic():
        tenant = Tenant.objects.create(
            name='Test Tenant',
            slug='test-tenant',
            schema_name='public',
        )
        Domain.objects.create(
            domain='localhost',
            tenant=tenant,
            is_primary=True,
        )
    return tenant


@pytest.fixture
def user(tenant):
    """Create a test user."""
    return User.objects.create_user(
        email='test@example.com',
        password='testpass123',
        first_name='Test',
        last_name='User',
        tenant=tenant,
    )


@pytest.fixture
def admin_user(tenant):
    """Create a test admin user."""
    return User.objects.create_superuser(
        email='admin@example.com',
        password='adminpass123',
        first_name='Admin',
        last_name='User',
        tenant=tenant,
    )


@pytest.fixture
def table_definition(tenant):
    """Create a test table definition."""
    return TableDefinition.objects.create(
        tenant=tenant,
        slug='products',
        name='محصولات',
        description='جدول محصولات',
        icon='package',
        is_active=True,
        enable_audit=True,
    )


@pytest.fixture
def table_columns(table_definition):
    """Create test columns for a table."""
    columns = [
        TableColumn.objects.create(
            table=table_definition,
            slug='name',
            name='نام محصول',
            field_type=FieldType.TEXT,
            is_required=True,
            is_searchable=True,
            order=1,
        ),
        TableColumn.objects.create(
            table=table_definition,
            slug='price',
            name='قیمت',
            field_type=FieldType.DECIMAL,
            is_required=True,
            config={'precision': 2},
            validation={'min': 0},
            order=2,
        ),
        TableColumn.objects.create(
            table=table_definition,
            slug='quantity',
            name='موجودی',
            field_type=FieldType.NUMBER,
            is_required=False,
            default_value='0',
            order=3,
        ),
        TableColumn.objects.create(
            table=table_definition,
            slug='is_active',
            name='فعال',
            field_type=FieldType.BOOLEAN,
            default_value='true',
            order=4,
        ),
        TableColumn.objects.create(
            table=table_definition,
            slug='category',
            name='دسته‌بندی',
            field_type=FieldType.SELECT,
            config={
                'options': [
                    {'value': 'electronics', 'label': 'الکترونیک'},
                    {'value': 'clothing', 'label': 'پوشاک'},
                    {'value': 'food', 'label': 'غذایی'},
                ]
            },
            order=5,
        ),
    ]
    return columns


@pytest.fixture
def table_record(table_definition, user):
    """Create a test record."""
    return TableRecord.objects.create(
        tenant=table_definition.tenant,
        table=table_definition,
        data={
            'name': 'محصول تست',
            'price': 100000,
            'quantity': 10,
            'is_active': True,
            'category': 'electronics',
        },
        owner=user,
    )


@pytest.fixture
def api_client():
    """Create a DRF test client with proper tenant host."""
    from rest_framework.test import APIClient
    
    class TenantAPIClient(APIClient):
        """APIClient that always sends HTTP_HOST for tenant resolution."""
        def request(self, **kwargs):
            # Ensure HTTP_HOST is set for tenant middleware
            if 'HTTP_HOST' not in kwargs:
                kwargs['HTTP_HOST'] = 'localhost'
            return super().request(**kwargs)
    
    return TenantAPIClient()


@pytest.fixture
def authenticated_client(api_client, user):
    """Create an authenticated API client."""
    from rest_framework_simplejwt.tokens import RefreshToken
    refresh = RefreshToken.for_user(user)
    api_client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
    return api_client


@pytest.fixture
def admin_client(api_client, admin_user):
    """Create an authenticated admin API client."""
    from rest_framework_simplejwt.tokens import RefreshToken
    refresh = RefreshToken.for_user(admin_user)
    api_client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
    return api_client
