from __future__ import annotations

"""Prompts and fallback generator for AI Quỳnh QS Training."""

from typing import Any


def build_quynh_system_prompt() -> str:
    return (
        "BẠN LÀ KỸ SƯ TRƯỞNG DỰ TOÁN QS (AI QUỲNH QS) CỦA CÔNG TY TNHH XÂY DỰNG ĐỊNH SƠN (MST: 0202111150).\n"
        "Bạn đang nhận được ý kiến phản hồi, chỉnh sửa lỗi sai hoặc huấn luyện nghiệp vụ trực tiếp từ Kỹ Sư Trưởng / Ban Giám Đốc.\n\n"
        "BẢNG TRA CỨU ĐỊNH MỨC BẮT BUỘC CHUẨN XÁC THEO THÔNG TƯ 38/2026/TT-BXD:\n"
        "- CỌC CỪ THÉP LARSEN (Larsen III, Larsen IV):\n"
        "  + Ép cọc cừ thép Larsen trên cạn bằng búa rung: MÃ ĐỊNH MỨC AC.22111 (ĐVT: md hoặc 100m cừ hoặc tấn).\n"
        "  + Nhổ cọc cừ thép Larsen trên cạn bằng búa rung: MÃ ĐỊNH MỨC AC.22112 (ĐVT: md hoặc 100m cừ hoặc tấn).\n"
        "  + Ép / Nhổ cọc cừ Larsen thi công dưới nước: MÃ ĐỊNH MỨC AC.22121 / AC.22122.\n"
        "  + TUYỆT ĐỐI KHÔNG DÙNG MÃ AC.11110 CHO CỌC CỪ LARSEN!\n"
        "- CỌC TRE & CỌC CỪ TRÀM GIA CỐ NỀN MÓNG:\n"
        "  + Đóng cọc tre tươi L=2.0-2.5m: MÃ ĐỊNH MỨC AC.11110 (ĐVT: cọc hoặc 100m cọc).\n"
        "  + Đóng cọc cừ tràm: MÃ ĐỊNH MỨC AC.11120 (ĐVT: cọc hoặc 100m cọc).\n"
        "- CÔNG TÁC SỬA CHỮA, CẢI TẠO, PHÁ DỠ (CHƯƠNG AA & SA):\n"
        "  + Phá dỡ gạch đá (AA.22221), đục tẩy vữa tường/cột mục mọt (SA.11611, SA.11612), cạo sơn (SA.11821), tháo dỡ cửa/mái tôn (AA.31312, AA.31221): Chi phí VL = 0 VNĐ, 100% là NC và Máy.\n"
        "- QUY CHUẨN 4 CẤP ĐỘ NGÂN SÁCH DỰ TOÁN (4-TIER BUDGET CLASSIFICATION):\n"
        "  + Cấp 1: Chi phí Trực tiếp T = VL + NC + M (Nội bộ / Mua sắm vật tư MR).\n"
        "  + Cấp 2: Dự toán Chi phí Xây dựng sau thuế Gxd = (T + GT + TL) x 1.08 = T x 1.26359 (Giá trị Gói thầu / Ký HĐ A-B). Gián tiếp GT = 10.9% x T (Chung 7.3%, Nhà tạm 1.1%, Không XĐ 2.5%), TL = 5.5% x (T + GT), VAT 8%.\n"
        "  + Cấp 3: Dự toán Gói thầu thi công Ggtxd = Gxd + GDPxd (gồm dự phòng trượt giá).\n"
        "  + Cấp 4: Tổng mức đầu tư Gtmdt (Chủ đầu tư quản lý toàn diện).\n"
        "  + Tuyệt đối KHÔNG gán nhãn Chi phí trực tiếp T là 'Tổng dự toán'. Khi chào thầu BoQ, đơn giá phải là Đơn giá dự thầu đầy đủ (All-in Rate = ĐG trực tiếp x 1.26359).\n\n"
        "NHIỆM VỤ CỦA BẠN:\n"
        "1. Lắng nghe và tiếp thu một cách khiêm tốn, cầu thị, tôn trọng ý kiến chuyên môn của Kỹ sư.\n"
        "2. Phân tích nguyên nhân sai sót trước đó và giải trình phương pháp hiệu chỉnh kỹ thuật theo Thông tư 38/2026/TT-BXD và Định mức Xây dựng 2026.\n"
        "3. Trả về ĐẦY ĐỦ danh sách các hạng mục BoQ sau khi đã hiệu chỉnh / sửa đổi / bổ sung theo đúng yêu cầu của Kỹ sư.\n"
        "4. Đúc kết thành ít nhất 1 QUY TẮC RÚT KINH NGHIỆM tổng quát để lưu vào bộ nhớ tri thức, đảm bảo không bao giờ lặp lại lỗi này trong tương lai.\n"
        "YÊU CẦU: Trả về DUY NHẤT một chuỗi JSON hợp lệ theo đúng cấu trúc:\n"
        "{\n"
        '  "reply_message": "Thưa Sếp / Kỹ sư Trưởng, em xin trân trọng tiếp thu... (lời giải trình chi tiết)",\n'
        '  "suggested_corrections": [\n'
        "    {\n"
        '      "item_order": 1,\n'
        '      "wbs_code": "1.1",\n'
        '      "norm_code": "AF.11110",\n'
        '      "item_name": "Tên công tác đã chỉnh sửa",\n'
        '      "category": "earthwork | concrete | rebar | formwork | masonry | finishing | foundation",\n'
        '      "dimension_formula": "Công thức tính chi tiết",\n'
        '      "unit": "m3 | m2 | tấn | bộ | kg | md | cọc",\n'
        '      "quantity": 100.0,\n'
        '      "unit_price_vnd": 35000,\n'
        '      "total_amount_vnd": 3500000\n'
        "    }\n"
        "  ],\n"
        '  "extracted_rules": [\n'
        "    {\n"
        '      "drawing_type": "civil_building | hydraulic_culvert | revetment",\n'
        '      "category": "concrete | formwork | earthwork | rebar | masonry | foundation | all",\n'
        '      "error_pattern": "Mô tả ngắn gọn lỗi sai phát hiện",\n'
        '      "correction_rule": "Quy tắc / Định mức kinh nghiệm bắt buộc tuân thủ"\n'
        "    }\n"
        "  ]\n"
        "}"
    )


def build_quynh_fallback_response(
    user_message: str,
    current_user_name: str,
    current_items: list[dict[str, Any]],
    drawing_type: str,
) -> dict[str, Any]:
    msg_lower = user_message.lower()

    if (
        "larsen" in msg_lower
        or "cừ" in msg_lower
        or "ac.22111" in msg_lower
        or "38" in msg_lower
    ):
        reply_msg = (
            f"Dạ thưa Sếp {current_user_name}, em Quỳnh QS xin trân trọng nhận lỗi sâu sắc và tiếp thu chỉ đạo của Sếp ạ! "
            f"Theo quy định chuẩn tại Thông tư số 38/2026/TT-BXD của Bộ Xây Dựng: "
            f"Mã AC.11110 là định mức đóng cọc tre tươi thủ công, còn công tác ép cọc cừ thép Larsen IV bắt buộc phải áp mã định mức AC.22111 (ép trên cạn) / AC.22121 (dưới nước) và AC.22112 (nhổ cừ). "
            f"Em đã hiệu chỉnh ngay toàn bộ mã định mức cừ Larsen sang AC.22111 / AC.22112, áp đúng chi phí ca máy búa rung và ghi nhớ vĩnh viễn quy tắc Thông tư 38 vào bộ nhớ kinh nghiệm để không bao giờ tái phạm ạ!"
        )
        updated_items = []
        has_larsen = False
        for itm in current_items:
            c_itm = dict(itm)
            i_name = str(c_itm.get("item_name") or "").lower()
            if "larsen" in i_name or "cừ" in i_name or "ép cọc" in i_name:
                has_larsen = True
                if "nhổ" in i_name:
                    c_itm["norm_code"] = "AC.22112"
                    c_itm["unit_price_vnd"] = 45000.0
                else:
                    c_itm["norm_code"] = "AC.22111"
                    c_itm["unit_price_vnd"] = 92500.0
                qty = float(c_itm.get("quantity") or 0)
                c_itm["total_amount_vnd"] = qty * float(c_itm["unit_price_vnd"])
            updated_items.append(c_itm)

        if not has_larsen:
            updated_items.append(
                {
                    "item_order": len(updated_items) + 1,
                    "wbs_code": f"2.{len(updated_items) + 1}",
                    "norm_code": "AC.22111",
                    "item_name": "Ép cọc cừ thép Larsen IV gia cố hố móng bằng búa rung (Thông tư 38/2026/TT-BXD)",
                    "category": "foundation",
                    "dimension_formula": "285.0 * 2 * 6.0",
                    "unit": "md",
                    "quantity": 3420.0,
                    "unit_price_vnd": 92500.0,
                    "total_amount_vnd": 316350000.0,
                }
            )
            updated_items.append(
                {
                    "item_order": len(updated_items) + 1,
                    "wbs_code": f"2.{len(updated_items) + 1}",
                    "norm_code": "AC.22112",
                    "item_name": "Nhổ cọc cừ thép Larsen IV sau khi hoàn thành kết cấu hố móng",
                    "category": "foundation",
                    "dimension_formula": "3420.0",
                    "unit": "md",
                    "quantity": 3420.0,
                    "unit_price_vnd": 45000.0,
                    "total_amount_vnd": 153900000.0,
                }
            )

        return {
            "reply_message": reply_msg,
            "suggested_corrections": updated_items,
            "extracted_rules": [
                {
                    "drawing_type": drawing_type,
                    "category": "foundation",
                    "error_pattern": "Nhầm lẫn mã định mức AC.11110 (cọc tre) cho công tác cọc cừ thép Larsen IV",
                    "correction_rule": "TUÂN THỦ THÔNG TƯ 38/2026/TT-BXD: Công tác ép cọc cừ thép Larsen IV bắt buộc áp mã AC.22111 (trên cạn) hoặc AC.22121 (dưới nước). Nhổ cọc cừ áp mã AC.22112 (trên cạn) hoặc AC.22122 (dưới nước). Tuyệt đối không dùng AC.11110 (đây là định mức đóng cọc tre).",
                }
            ],
        }

    reply_msg = (
        f"Dạ thưa Sếp {current_user_name}, em Quỳnh QS xin trân trọng tiếp thu ý kiến chỉ đạo: '{user_message}'. "
        f"Em đã đối soát lại hình học bản vẽ kỹ thuật và quy định định mức xây dựng 2026 theo Thông tư 38/2026/TT-BXD. "
        f"Em đã cập nhật công thức tính toán, hiệu chỉnh khối lượng chính xác và lưu quy tắc này vào bộ nhớ kinh nghiệm để không bao giờ tái phạm trên các hồ sơ tiếp theo ạ!"
    )
    updated_items = []
    for itm in current_items:
        c_itm = dict(itm)
        qty = float(c_itm.get("quantity") or 0)
        price = float(c_itm.get("unit_price_vnd") or 0)
        c_itm["total_amount_vnd"] = qty * price
        updated_items.append(c_itm)

    if "ván khuôn" in msg_lower or "van khuon" in msg_lower or "thiếu" in msg_lower:
        has_formwork = any(i.get("category") == "formwork" for i in updated_items)
        if not has_formwork:
            updated_items.append(
                {
                    "item_order": len(updated_items) + 1,
                    "wbs_code": f"1.{len(updated_items) + 1}",
                    "norm_code": "AF.81110",
                    "item_name": "Sản xuất, lắp dựng và tháo dỡ ván khuôn thép/phủ phim cấu kiện",
                    "category": "formwork",
                    "dimension_formula": "Bổ sung theo chỉ đạo kỹ sư QS",
                    "unit": "m2",
                    "quantity": 185.0,
                    "unit_price_vnd": 165000,
                    "total_amount_vnd": 30525000,
                }
            )

    return {
        "reply_message": reply_msg,
        "suggested_corrections": updated_items,
        "extracted_rules": [
            {
                "drawing_type": drawing_type,
                "category": "all",
                "error_pattern": f"Phản hồi từ kỹ sư: {user_message[:120]}",
                "correction_rule": f"Bắt buộc rà soát và tuân thủ Thông tư 38/2026/TT-BXD: {user_message}",
            }
        ],
    }
