"""Vision & Multimodal AI Reasoning Engine for Automated Engineering Takeoff.
Leverages Google Gemini 3.1 Pro High Reasoning, dual CAD & HSMT pairing,
and 2026 construction legal norms compliance.
"""

from __future__ import annotations

import logging
from pathlib import Path
from typing import Any

import fitz

from app.modules.agents.application.llm_client import LLMClient
from app.modules.takeoff.application.vietnamese_cad_font_transcoder import (
    get_vietnamese_cad_font_transcoder,
)

logger = logging.getLogger("dscons.takeoff.vision_reasoning")


class TakeoffVisionReasoningEngine:
    """Engine handling Gemini 3.1 Pro high reasoning vision takeoff."""

    def __init__(self, erp_client: Any, llm_client: LLMClient):
        self._erp_client = erp_client
        self._llm_client = llm_client
        self._font_transcoder = get_vietnamese_cad_font_transcoder()

    def discover_related_hsmt(
        self,
        drawing_filename: str,
        hint: str | None = None,
        search_dirs: list[Path | str] | None = None,
    ) -> tuple[str | None, str | None]:
        """Auto-discover matching HSMT / BoQ Excel / PDF tender specifications."""
        if search_dirs is None:
            search_dirs = [
                Path("HĐ-2026"),
                Path("HĐ-2026/TTDVSNC Kiến Minh-2026"),
                Path("HĐ-2026/NVH Đại Thắng-2026"),
                Path("storage/secure_vault"),
                Path("app/static/drawings"),
            ]

        keywords = []
        name_lower = drawing_filename.lower()
        if (
            "kien minh" in name_lower
            or "kenh ong den" in name_lower
            or "ong den" in name_lower
            or "ttdvsnc" in name_lower
        ):
            keywords.extend(
                [
                    "kien minh",
                    "ong den",
                    "bieu_mau",
                    "mời thầu",
                    "moi thau",
                    "hsmt",
                    "du toan",
                ]
            )
        if "dai thang" in name_lower or "nvh" in name_lower:
            keywords.extend(["dai thang", "nvh", "mời thầu", "hsmt"])
        if hint:
            keywords.extend([w.strip().lower() for w in hint.split() if len(w) > 3])

        hsmt_extensions = [".pdf", ".xlsx", ".xls", ".doc", ".docx"]

        for s_dir in search_dirs:
            p_dir = Path(s_dir)
            if not p_dir.exists():
                continue
            try:
                for file_path in p_dir.rglob("*"):
                    if not file_path.is_file():
                        continue
                    if file_path.suffix.lower() not in hsmt_extensions:
                        continue
                    if file_path.name.lower() == drawing_filename.lower():
                        continue

                    f_lower = file_path.name.lower()
                    if (
                        "mời thầu" in f_lower
                        or "moi thau" in f_lower
                        or "hsmt" in f_lower
                        or "bieu_mau" in f_lower
                        or "bảng tiên lượng" in f_lower
                        or "du toan" in f_lower
                    ):
                        for kw in keywords:
                            if kw in f_lower:
                                content_summary = self._read_hsmt_sample_text(file_path)
                                logger.info(
                                    "[TAKEOFF] Đã tự động phát hiện HSMT đối soát kép: %s",
                                    file_path.name,
                                )
                                return file_path.name, content_summary
            except Exception as e:
                logger.warning("[TAKEOFF] Lỗi quét HSMT tại %s: %s", s_dir, e)

        return None, None

    def _read_hsmt_sample_text(self, file_path: Path) -> str:
        """Read text summary from HSMT PDF or Excel file."""
        ext = file_path.suffix.lower()
        if ext == ".pdf":
            try:
                doc = fitz.open(str(file_path))
                text_parts = []
                for p_idx in range(min(5, len(doc))):
                    page_text = doc[p_idx].get_text("text")
                    if page_text:
                        text_parts.append(page_text)
                doc.close()
                return "\n".join(text_parts)[:4000]
            except Exception as e:
                logger.warning(
                    "[TAKEOFF] Không thể đọc text từ PDF HSMT %s: %s", file_path.name, e
                )
                return ""
        return ""

    def extract_ai_friendly_pdf_structure(
        self, file_path: Path | str
    ) -> dict[str, Any]:
        """Extract structured headings, tables, blocks, and CAD text to maximize AI comprehension."""
        p = Path(file_path)
        if not p.exists() or p.suffix.lower() != ".pdf":
            return {"page_count": 0, "structure": []}

        pages_data = []
        try:
            doc = fitz.open(str(p))
            for page_idx in range(len(doc)):
                page = doc[page_idx]
                raw_text = page.get_text("text")
                clean_text = self._font_transcoder.decode_cad_text(raw_text)

                blocks = page.get_text("blocks")
                headers = []
                tables_detected = 0

                for b in blocks:
                    block_text = b[4].strip()
                    if not block_text:
                        continue
                    clean_b = self._font_transcoder.decode_cad_text(block_text)
                    if any(
                        kw in clean_b.upper()
                        for kw in [
                            "MẶT BẰNG",
                            "MẶT CẮT",
                            "CHI TIẾT",
                            "THỐNG KÊ",
                            "BẢNG TIÊN LƯỢNG",
                            "DỰ TOÁN",
                            "BÊ TÔNG",
                            "CỐT THÉP",
                        ]
                    ):
                        headers.append(clean_b[:120])
                    if any(
                        kw in clean_b
                        for kw in [
                            "STT",
                            "ĐVT",
                            "Khối lượng",
                            "Đơn giá",
                            "Thành tiền",
                            "Ký hiệu",
                        ]
                    ):
                        tables_detected += 1

                pages_data.append(
                    {
                        "page_number": page_idx + 1,
                        "width": float(page.rect.width),
                        "height": float(page.rect.height),
                        "headers": headers[:8],
                        "tables_detected": tables_detected,
                        "clean_text_preview": clean_text[:600],
                    }
                )
            doc.close()
        except Exception as e:
            logger.error("[TAKEOFF] Lỗi trích xuất cấu trúc AI PDF: %s", e)

        return {
            "page_count": len(pages_data),
            "structure": pages_data,
        }
