from __future__ import annotations

import logging
from typing import Any

from .mission_synthesis import DeepSeekMissionSynthesisMixin

logger = logging.getLogger("dscons.deepseek.steps")


class DeepSeekMissionStepsMixin(DeepSeekMissionSynthesisMixin):
    """Mission step decomposition mixin."""

    async def _decompose_mission_steps(
        self,
        mission_title: str,
        mission_prompt: str,
        pillar: str,
        target_project_id: str | None = None,
    ) -> list[dict[str, Any]]:
        """Phân rã nhiệm vụ thành chuỗi các bước phối hợp (Sử dụng LLM, không dùng dữ liệu Mock)."""
        import json
        
        # Lấy danh sách Agents thực từ CSDL để LLM có thể phân rã
        available_agents = self.postgres_client.list_ai_agent_models()
        agents_info = "\n".join([f"- {a['agent_code']} ({a.get('display_name', '')}): {a.get('role_title', '')}" for a in available_agents])

        available_tools = """
- tool_query_erp_ledger: Truy xuất sổ cái ERP
- tool_hybrid_search_knowledge: Tra cứu tri thức, hồ sơ pháp lý, tài liệu kỹ thuật
- tool_boq_and_ipc_calculation: Bóc tách khối lượng, lập Bảng phụ lục 03a
- tool_audit_3way_matching: Đối soát 3 bên, xử lý hóa đơn, tạm ứng
- tool_equipment_and_fuel_audit: Kiểm toán thiết bị, ca máy, nhiên liệu
- tool_legal_fidic_check: Rà soát pháp lý hợp đồng FIDIC
- tool_write_erp_ledger: [QUYỀN CHUẨN Y] Ghi sổ cái/Cập nhật CSDL (CHỈ DÀNH CHO THUỶ)
"""

        prompt = f"""
Nhiệm vụ (Mission): {mission_title}
Yêu cầu chi tiết: {mission_prompt}
Trụ cột nghiệp vụ (Pillar): {pillar}

Danh sách AI Agents có sẵn:
{agents_info}

Danh sách Tools có sẵn:
{available_tools}

ĐẶC BIỆT LƯU Ý: Theo chỉ đạo của Ban Giám đốc, BƯỚC ĐẦU TIÊN (Step 1) luôn luôn phải giao cho Thuỷ (Trợ lý Giám đốc) để tiếp nhận nhiệm vụ, phân tích tổng quan yêu cầu, và lên phương án điều phối các nhân viên khác làm việc. Các bước tiếp theo mới phân bổ cho các Agent chuyên môn tương ứng.

Hãy phân rã nhiệm vụ trên thành một chuỗi các bước phối hợp liên phòng ban.
Trả về định dạng JSON là một mảng các object. Mỗi object đại diện cho một bước, với các khóa sau:
- "agent_code": Mã agent (chọn từ danh sách trên)
- "agent_name": Tên agent tương ứng
- "role_title": Chức danh của agent
- "reasoning": Mục tiêu dự kiến/kế hoạch phân tích của bước này
- "tool_to_call": Chọn MỘT tool duy nhất từ danh sách Tools có sẵn để agent chạy
- "tool_args": Một JSON object chứa các tham số truyền vào tool (ví dụ: {{"entity_type": "equipment"}} hoặc {{"project_id": "DA-KM-BENKEM-2025-2026"}})

CHỈ TRẢ VỀ JSON, KHÔNG CÓ MARKDOWN HAY CHÚ THÍCH.
Ví dụ:
[
  {{
    "agent_code": "phuc",
    "agent_name": "Phúc",
    "role_title": "Kỹ sư Quản lý Tiến độ",
    "reasoning": "Tôi sẽ tập hợp nhật ký công trường",
    "tool_to_call": "tool_query_erp_ledger",
    "tool_args": {{"entity_type": "documents"}}
  }}
]
"""
        try:
            llm_response = await self.llm_client.chat(
                [{"role": "user", "content": prompt}],
                temperature=0.2
            )
            if llm_response.startswith("```json"):
                llm_response = llm_response.replace("```json", "").replace("```", "").strip()
            elif llm_response.startswith("```"):
                llm_response = llm_response.replace("```", "").strip()
            
            steps = json.loads(llm_response)
            
            # Đảm bảo các thuộc tính bắt buộc tồn tại
            for step in steps:
                step["output_summary"] = step.get("output_summary", "...")
                step["tool_to_call"] = step.get("tool_to_call", "tool_query_erp_ledger")
                step["tool_args"] = step.get("tool_args", {})
                step["agent_name"] = step.get("agent_name", "AI Agent")
                step["agent_code"] = step.get("agent_code", "minh")
                step["role_title"] = step.get("role_title", "Chuyên viên")
                step["reasoning"] = step.get("reasoning", "Đang xử lý nghiệp vụ...")
            return steps
        except Exception as e:
            logger.error(f"Error parsing LLM mission decomposition: {e}")
            # Trả về một bước cơ bản an toàn nếu LLM lỗi để không làm sập hệ thống (Không mock data nghiệp vụ)
            return [
                {
                    "agent_code": "minh",
                    "agent_name": "Minh",
                    "role_title": "Điều phối Tổng",
                    "reasoning": "Rà soát thông tin chung do lỗi sinh kế hoạch tự động.",
                    "tool_to_call": "tool_query_erp_ledger",
                    "output_summary": "..."
                }
            ]
