import unittest

from app.models.company_operational_state_schemas import (
    CompanyOperationalBacklogItem,
    CompanyOperationalBlockedItem,
    CompanyOperationalProjectState,
    CompanyOperationalRiskItem,
    CompanyOperationalSourceStatus,
    CompanyOperationalStateResponse,
    CompanyOperationalSummary,
    CompanyOperationalWorkforceStatus,
)
from app.models.schemas import (
    CompanyOperationalStateResponse as LegacyCompanyOperationalStateResponse,
)
from app.models.schemas import (
    DossierCase,
    DossierReviewSessionRecord,
    OperationsActionItem,
)


class CompanyOperationalStateSchemasTests(unittest.TestCase):
    def test_legacy_schema_export_points_to_extracted_model(self) -> None:
        self.assertIs(
            LegacyCompanyOperationalStateResponse, CompanyOperationalStateResponse
        )

    def test_company_operational_state_response_accepts_expected_nested_contract(
        self,
    ) -> None:
        payload = CompanyOperationalStateResponse.model_validate(
            {
                "generated_at": "2026-04-02T17:00:00+07:00",
                "source": "postgres",
                "used_fallback": False,
                "summary": {
                    "total_projects": 3,
                    "blocked_items_count": 1,
                    "backlog_items_count": 2,
                    "active_review_sessions": 1,
                },
                "projects": [
                    {
                        "project_code": "PRJ-001",
                        "project_name": "Dinh Son",
                        "status": "active",
                        "open_risks_count": 1,
                    }
                ],
                "risks": [
                    {
                        "project_code": "PRJ-001",
                        "title": "Thiếu hồ sơ",
                        "source_type": "dossier_review",
                    }
                ],
                "blocked_items": [
                    {
                        "project_code": "PRJ-001",
                        "title": "Chờ bổ sung quyết định phê duyệt",
                        "source_type": "operations_case",
                    }
                ],
                "backlog": [
                    {
                        "project_code": "PRJ-001",
                        "title": "Theo dõi bổ sung hồ sơ",
                        "source_type": "operations_action",
                    }
                ],
                "workforce": {
                    "total_employees_active": 4,
                    "employees_in_progress": 3,
                    "notes": ["legal team processing"],
                },
                "source_status": [
                    {
                        "source_name": "projects",
                        "source": "postgres",
                        "available": True,
                        "record_count": 10,
                    }
                ],
                "operations_cases": [
                    {
                        "case_id": "case-1",
                        "case_code": "CASE-001",
                        "project_code": "PRJ-001",
                        "case_type": "missing_document",
                        "title": "Thiếu quyết định",
                        "current_status": "open",
                    }
                ],
                "operations_actions": [
                    {
                        "action_id": "action-1",
                        "action_code": "ACT-001",
                        "case_id": "case-1",
                        "project_code": "PRJ-001",
                        "action_type": "follow_up",
                        "title": "Liên hệ bổ sung",
                        "status": "pending",
                    }
                ],
                "operations_blockers": [
                    {
                        "project_code": "PRJ-001",
                        "title": "Chờ duyệt",
                        "source_type": "workflow",
                    }
                ],
                "dossier_reviews": [
                    {
                        "review_id": "review-1",
                        "review_code": "RVW-001",
                        "project_code": "PRJ-001",
                        "project_name": "Dinh Son",
                        "dossier_scope": "project_dossier",
                        "trigger_source": "system",
                        "status": "assigned",
                    }
                ],
                "policy_overview": {"blocked_checks": 1},
                "message": "ok",
            }
        )

        self.assertIsInstance(payload.summary, CompanyOperationalSummary)
        self.assertIsInstance(payload.projects[0], CompanyOperationalProjectState)
        self.assertIsInstance(payload.risks[0], CompanyOperationalRiskItem)
        self.assertIsInstance(payload.blocked_items[0], CompanyOperationalBlockedItem)
        self.assertIsInstance(payload.backlog[0], CompanyOperationalBacklogItem)
        self.assertIsInstance(payload.workforce, CompanyOperationalWorkforceStatus)
        self.assertIsInstance(payload.source_status[0], CompanyOperationalSourceStatus)
        self.assertIsInstance(payload.operations_cases[0], DossierCase)
        self.assertIsInstance(payload.operations_actions[0], OperationsActionItem)
        self.assertIsInstance(payload.dossier_reviews[0], DossierReviewSessionRecord)
        self.assertEqual(payload.policy_overview["blocked_checks"], 1)

    def test_company_operational_state_response_defaults_nested_collections(
        self,
    ) -> None:
        payload = CompanyOperationalStateResponse(
            generated_at="2026-04-02T17:00:00+07:00",
            source="postgres",
            used_fallback=False,
            summary=CompanyOperationalSummary(),
            workforce=CompanyOperationalWorkforceStatus(),
        )

        self.assertEqual(payload.projects, [])
        self.assertEqual(payload.risks, [])
        self.assertEqual(payload.blocked_items, [])
        self.assertEqual(payload.backlog, [])
        self.assertEqual(payload.source_status, [])
        self.assertEqual(payload.operations_cases, [])
        self.assertEqual(payload.operations_actions, [])
        self.assertEqual(payload.operations_blockers, [])
        self.assertEqual(payload.dossier_reviews, [])
        self.assertEqual(payload.policy_overview, {})


if __name__ == "__main__":
    unittest.main()
