"""
CLM Module — API Tests.

تست‌های API ماژول مدیریت قراردادها.
"""
import pytest
from datetime import date, timedelta
from decimal import Decimal
from uuid import uuid4

from django.test import TestCase
from rest_framework.test import APIClient
from rest_framework import status


@pytest.mark.django_db
class TestContractAPI:
    """تست‌های API قرارداد."""

    @pytest.fixture(autouse=True)
    def setup(self, tenant_client):
        """ست‌آپ کلاینت با tenant."""
        self.client = tenant_client

    def test_list_contracts(self):
        response = self.client.get("/api/v1/clm/contracts/")
        assert response.status_code == status.HTTP_200_OK

    def test_create_contract(self):
        data = {
            "contract_number": "CNT-1404-0001",
            "title": "قرارداد تست",
            "category": "COMMERCIAL",
            "contract_type": "PURCHASE",
            "priority": "NORMAL",
            "start_date": str(date.today()),
            "end_date": str(date.today() + timedelta(days=365)),
            "total_value": "1000000000",
        }
        response = self.client.post("/api/v1/clm/contracts/", data, format="json")
        assert response.status_code in (status.HTTP_201_CREATED, status.HTTP_200_OK)

    def test_delete_non_draft_fails(self):
        """حذف قرارداد فعال باید رد شود."""
        # ابتدا ایجاد و سپس فعال‌سازی
        data = {
            "contract_number": "CNT-1404-0002",
            "title": "قرارداد برای حذف",
            "category": "COMMERCIAL",
            "contract_type": "SERVICE",
            "start_date": str(date.today()),
            "end_date": str(date.today() + timedelta(days=365)),
            "total_value": "500000",
        }
        create_resp = self.client.post("/api/v1/clm/contracts/", data, format="json")
        if create_resp.status_code in (status.HTTP_201_CREATED, status.HTTP_200_OK):
            contract_id = create_resp.data.get("id")
            if contract_id:
                # تغییر وضعیت به ACTIVE
                self.client.post(f"/api/v1/clm/contracts/{contract_id}/approve/")
                self.client.post(f"/api/v1/clm/contracts/{contract_id}/activate/")
                # تلاش حذف
                delete_resp = self.client.delete(f"/api/v1/clm/contracts/{contract_id}/")
                assert delete_resp.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY


@pytest.mark.django_db
class TestContractTemplateAPI:
    """تست‌های API قالب قرارداد."""

    @pytest.fixture(autouse=True)
    def setup(self, tenant_client):
        self.client = tenant_client

    def test_list_templates(self):
        response = self.client.get("/api/v1/clm/templates/")
        assert response.status_code == status.HTTP_200_OK

    def test_create_template(self):
        data = {
            "name": "قالب تست",
            "category": "COMMERCIAL",
            "contract_type": "PURCHASE",
            "is_active": True,
        }
        response = self.client.post("/api/v1/clm/templates/", data, format="json")
        assert response.status_code in (status.HTTP_201_CREATED, status.HTTP_200_OK)


@pytest.mark.django_db
class TestContractMilestoneAPI:
    """تست‌های API مراحل قرارداد."""

    @pytest.fixture(autouse=True)
    def setup(self, tenant_client):
        self.client = tenant_client

    def test_list_milestones(self):
        response = self.client.get("/api/v1/clm/milestones/")
        assert response.status_code == status.HTTP_200_OK

    def test_overdue_milestones(self):
        response = self.client.get("/api/v1/clm/milestones/overdue/")
        assert response.status_code == status.HTTP_200_OK


@pytest.mark.django_db
class TestContractDashboard:
    """تست‌های داشبورد."""

    @pytest.fixture(autouse=True)
    def setup(self, tenant_client):
        self.client = tenant_client

    def test_dashboard(self):
        response = self.client.get("/api/v1/clm/contracts/dashboard/")
        assert response.status_code == status.HTTP_200_OK
        data = response.json().get("data", {})
        assert "by_status" in data
        assert "total_active_value" in data
        assert "total_contracts" in data
