"""Automated test suite for Advanced BIM 4D/5D, EVM S-Curve Analytics, and Autonomous AI Features."""

import unittest

from fastapi.testclient import TestClient

from app.modules.auth.presentation.auth import get_current_user
from app.main import create_app
from app.modules.operations.application.ai_site_diary_service import AISiteDiaryService
from app.modules.financial.application.evm_calculation_service import EvmCalculationService


class TestAdvancedBimEvmAiFeatures(unittest.TestCase):
    def setUp(self):
        self.app = create_app()
        self.client = TestClient(self.app)
        self.evm_service = EvmCalculationService()
        self.ai_service = AISiteDiaryService()

    def tearDown(self):
        self.app.dependency_overrides = {}

    def test_evm_service_calculation(self):
        """Kiểm thử engine EVM tính toán CPI, SPI, EAC và số liệu S-Curve."""
        evm = self.evm_service.get_project_evm_analytics("DA-DADO-PHULIEN-2026")
        self.assertNotIn("error", evm)
        self.assertIn("cpi", evm)
        self.assertIn("spi", evm)
        self.assertIn("estimate_at_completion_eac", evm)
        self.assertIn("s_curve_points", evm)
        self.assertEqual(len(evm["s_curve_points"]), 6)
        self.assertGreater(evm["cpi"], 0)
        self.assertGreater(evm["spi"], 0)

    def test_voice_to_site_diary_parser(self):
        """Kiểm thử AI bóc tách giọng nói/transcript thành phiếu nhật ký thi công."""
        transcript = (
            "Hôm nay ngày 21 tháng 8 công trường trạm bơm Nam Hưng nắng ráo ba mươi tư công nhân "
            "bốn ca máy đào đất hố móng và gia công cốt thép đài móng ĐM1 lấy ba tổ mẫu bê tông R28 đạt yêu cầu."
        )
        diary = self.ai_service.process_voice_to_diary(
            project_id="00000000-0000-0000-0000-000000000001",
            transcript_text=transcript,
        )
        self.assertEqual(diary["status"], "success")
        self.assertEqual(diary["workforce_count"], 34)
        self.assertEqual(diary["machine_count"], 4)
        self.assertIn("Nắng", diary["weather_condition"])
        self.assertGreaterEqual(diary["extracted_activities_count"], 1)

    def test_fidic_ipc_dossier_assembly(self):
        """Kiểm thử AI tự động gom và sinh bộ hồ sơ nghiệm thu thanh toán IPC chuẩn FIDIC."""
        ipc = self.ai_service.assemble_fidic_ipc_dossier(
            "DA-DADO-PHULIEN-2026", ipc_number=2
        )
        self.assertEqual(ipc["status"], "assembled")
        self.assertIn("financial_summary", ipc)
        self.assertEqual(ipc["ipc_clearance_status"], "SAN_SANG_GIAI_NGAN")
        self.assertEqual(len(ipc["attached_dossier_checklists"]), 5)

    def test_advanced_api_routes(self):
        """Kiểm thử các REST endpoints của phân hệ nâng cao."""
        self.app.dependency_overrides[get_current_user] = lambda: {
            "id": "admin-id",
            "email": "admin@dscons.vn",
            "role": "superadmin",
        }

        # 1. BIM Elements
        res_bim = self.client.get(
            "/v1/erp/advanced/projects/DA-DADO-PHULIEN-2026/bim-elements"
        )
        self.assertEqual(res_bim.status_code, 200)
        bim_elements = res_bim.json()
        self.assertIsInstance(bim_elements, list)
        self.assertGreaterEqual(len(bim_elements), 3)

        # 2. EVM Analytics & S-Curve
        res_evm = self.client.get(
            "/v1/erp/advanced/projects/DA-DADO-PHULIEN-2026/evm-analytics"
        )
        self.assertEqual(res_evm.status_code, 200)
        evm_data = res_evm.json()
        self.assertIn("cpi", evm_data)
        self.assertIn("s_curve_points", evm_data)

        # 3. Voice Site Diary
        res_voice = self.client.post(
            "/v1/erp/advanced/projects/00000000-0000-0000-0000-000000000001/voice-site-diary",
            json={
                "transcript_text": "Trời nắng 32 độ, 20 thợ đổ bê tông móng và thử áp lực ống HDPE"
            },
        )
        self.assertEqual(res_voice.status_code, 200)
        self.assertEqual(res_voice.json()["status"], "success")

        # 4. IPC Dossier Generation
        res_ipc = self.client.post(
            "/v1/erp/advanced/projects/DA-DADO-PHULIEN-2026/generate-ipc-dossier"
        )
        self.assertEqual(res_ipc.status_code, 200)
        self.assertEqual(res_ipc.json()["ipc_clearance_status"], "SAN_SANG_GIAI_NGAN")

        # 5. Early Warning Radar
        res_radar = self.client.get("/v1/erp/advanced/early-warning-radar")
        self.assertEqual(res_radar.status_code, 200)
        self.assertIsInstance(res_radar.json(), list)


if __name__ == "__main__":
    unittest.main()
