"""
CLM Module — Pytest Fixtures.

فیکسچرهای مشترک برای تست‌های ماژول مدیریت قراردادها.
"""
import os
import sys
from pathlib import Path
import uuid
from datetime import date, timedelta
from decimal import Decimal

# Ensure project root is on sys.path so "modules.clm.backend" is importable
PROJECT_ROOT = str(Path(__file__).resolve().parent.parent.parent.parent)
BACKEND_ROOT = str(Path(__file__).resolve().parent.parent.parent.parent / "backend")
if PROJECT_ROOT not in sys.path:
    sys.path.insert(0, PROJECT_ROOT)
if BACKEND_ROOT not in sys.path:
    sys.path.insert(0, BACKEND_ROOT)

# Ensure Django is configured BEFORE any Django imports
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.test")
import django
django.setup()

import pytest

from apps.core.tenant.models import Tenant, Domain
from apps.core.tenant.middleware import _thread_locals
from apps.core.auth.models import User

# ─── Force import of CLM views BEFORE any test runs ─────────
# This ensures the ViewSet class-level `queryset` attributes are
# evaluated while get_current_tenant() returns None (no tenant),
# preventing a stale tenant_id from being baked into the queryset's
# WHERE clause via TenantAwareManager.
import modules.clm.backend.api.v1.views  # noqa: F401


# ─── Tenant & Auth ──────────────────────────────────────────

@pytest.fixture(autouse=True)
def _patch_tenant_middleware(tenant, monkeypatch):
    """
    Ensure get_current_tenant() returns the fixture tenant for ORM queries.
    """
    from django.db import connection
    from apps.core.tenant import middleware as tenant_mw

    monkeypatch.setattr(tenant_mw, "get_current_tenant", lambda: tenant)

    if hasattr(connection, "set_tenant"):
        connection.set_tenant(tenant)

    yield

    if hasattr(_thread_locals, "tenant"):
        del _thread_locals.tenant
    if hasattr(_thread_locals, "request"):
        del _thread_locals.request


@pytest.fixture(scope="function")
def tenant(db):
    """Create a test tenant with domain."""
    t = Tenant.objects.create(
        name="Test Tenant CLM",
        slug="test-tenant-clm",
        schema_name="public",
    )
    Domain.objects.create(
        domain="localhost",
        tenant=t,
        is_primary=True,
    )
    return t


@pytest.fixture
def user(tenant):
    """Create a regular user."""
    return User.objects.create_user(
        email="clm-user@example.com",
        password="testpass123",
        first_name="CLM",
        last_name="User",
        tenant=tenant,
    )


@pytest.fixture
def admin_user(tenant):
    """Create a superuser."""
    return User.objects.create_superuser(
        email="clm-admin@example.com",
        password="adminpass123",
        first_name="CLM",
        last_name="Admin",
        tenant=tenant,
    )


@pytest.fixture
def api_client():
    """DRF APIClient that sends HTTP_HOST for tenant middleware."""
    from rest_framework.test import APIClient

    class TenantAPIClient(APIClient):
        def request(self, **kwargs):
            if "HTTP_HOST" not in kwargs:
                kwargs["HTTP_HOST"] = "localhost"
            return super().request(**kwargs)

    return TenantAPIClient()


@pytest.fixture
def authenticated_client(api_client, user):
    """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):
    """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


@pytest.fixture
def tenant_client(admin_client):
    """
    Alias for admin_client — provides an authenticated API client
    with superuser permissions and tenant context.

    This is the fixture used by test_api.py.
    """
    return admin_client


# ─── CLM Test Data ───────────────────────────────────────────

@pytest.fixture
def contract_data(tenant):
    """Basic contract creation data."""
    return {
        "contract_number": "CNT-1404-0001",
        "title": "قرارداد تست",
        "category": "COMMERCIAL",
        "contract_type": "COMMERCIAL_PURCHASE",
        "priority": "NORMAL",
        "start_date": str(date.today()),
        "end_date": str(date.today() + timedelta(days=365)),
        "total_value": "1000000000",
        "currency": "IRR",
    }


@pytest.fixture
def template_data():
    """Basic template creation data."""
    return {
        "name": "قالب تست",
        "category": "COMMERCIAL",
        "contract_type": "COMMERCIAL_PURCHASE",
        "is_active": True,
    }
