from __future__ import annotations

from decimal import Decimal
from typing import Any

from app.models.four_pillars_schemas import IPC03aExportRequest


class ToolDispatcherMixin:
    """Tool execution and dispatch mixin for MCP server."""

    def _execute_tool(self, tool_name: str, args: dict[str, Any]) -> Any:
        """Thực thi nghiệp vụ cụ thể theo tên Tool."""
        if tool_name == "search_dscons_knowledge":
            query = args.get("query", "")
            top_k = args.get("top_k", 5)
            docs = self.postgres_client.list_documents()
            matched = [
                d
                for d in docs
                if any(
                    word.lower()
                    in (d.get("document_name", "") + d.get("notes", "")).lower()
                    for word in query.split()[:3]
                )
            ][:top_k]
            return {"status": "SUCCESS", "count": len(matched), "results": matched}

        elif tool_name == "query_erp_ledger":
            entity_type = args.get("entity_type", "equipment")
            if entity_type == "equipment":
                return self.postgres_client.list_equipment()
            else:
                return self.postgres_client.list_documents()

        elif tool_name == "audit_3way_matching":
            project_code = args.get("project_code", "DA-KM-BENKEM-2025-2026")
            res = self.four_pillars.get_3way_matching_details(project_code=project_code)
            return [r.model_dump() for r in res]

        elif tool_name == "calculate_ipc_03a":
            req = IPC03aExportRequest(
                project_code=args.get("project_id", "DA-KM-BENKEM-2025-2026"),
                period_number=args.get("stage_number", 2),
                advance_recovery_rate_pct=Decimal(
                    str(args.get("advance_deduction_pct", 10.0))
                ),
                retention_rate_pct=Decimal(str(args.get("retention_pct", 5.0))),
                vat_rate_pct=Decimal("8.0000"),
            )
            dossier = self.four_pillars.generate_ipc_document(req)
            return dossier.model_dump()

        elif tool_name == "audit_equipment_and_fuel":
            vat = args.get("partner_vat_code", "0200149705")
            if vat == "0200149705":
                return self.four_pillars.reconcile_sludge_transport().model_dump()
            else:
                return self.four_pillars.reconcile_equipment_rental().model_dump()

        elif tool_name == "check_fidic_compliance":
            return {
                "law_reference": "Luật Xây dựng 2025 (Luật số 135/2025/QH15)",
                "fidic_clause": "Clause 14.3 (Application for Interim Payment Certificates)",
                "validity": "COMPLIANT",
                "notes": "Tuân thủ chặt chẽ định mức xây dựng 2026 và hợp đồng FIDIC chuẩn.",
            }

        else:
            raise ValueError(f"Không nhận diện được tool: {tool_name}")
