"""
Presentation Routes for Inverse-BIM Constraint Solver & Tri-Source Truth Grounding.
Zero raw SQL/DDL, strict schema validation, and complete real-world verification.
"""

from __future__ import annotations

import logging
from typing import Any

from fastapi import APIRouter, Depends, HTTPException, status
from pydantic import BaseModel, Field

from app.modules.auth.presentation.auth import require_role
from app.modules.takeoff.application.drawing_takeoff_service import (
    get_drawing_takeoff_service,
)

logger = logging.getLogger(__name__)

router = APIRouter(tags=["Inverse-BIM & Tri-Source Truth Grounding"])


class InverseBimSolveRequest(BaseModel):
    cad_source_path: str | None = Field(default=None, description="Đường dẫn file CAD (DXF, DWG, PDF)")
    num_segments: int | None = Field(default=5, description="Số phân đoạn thi công")
    segment_length_m: float | None = Field(default=43.0, description="Chiều dài mỗi phân đoạn (m)")
    structure_name: str | None = Field(
        default="Hệ thống cống hộp kênh Bến Kem", description="Tên công trình"
    )


class TriSourceReconcileRequest(BaseModel):
    cad_source_path: str | None = None
    bbs_source_path: str | None = None
    hsmt_source_path: str | None = None
    project_name: str | None = "XÂY DỰNG HỆ THỐNG CỐNG HỘP KÊNH BẾN KEM, XÃ KIẾN MINH"
    package_name: str | None = "Gói thầu số 6: Gói thầu xây lắp"


_AUTHENTICATED_ROLE = require_role(["superadmin", "director", "manager", "engineer", "staff"])


@router.get(
    "/ben-kem/tri-source-audit",
    response_model=dict[str, Any],
    summary="Kiểm toán chéo Tri-Source Truth Grounding công trình cống hộp Bến Kem",
)
def get_ben_kem_tri_source_audit(
    current_user: dict[str, Any] = Depends(_AUTHENTICATED_ROLE),  # noqa: B008
) -> dict[str, Any]:
    """
    Thực thi kiểm toán chéo 3 nguồn chân lý (Tri-Source Truth Grounding):
    1. Hình học không gian CAD Model Space (Cống hộp 2.5x2.5m, L=215m, 5 phân đoạn)
    2. Bảng thống kê cốt thép kết cấu BBS (42.1876 tấn cốt thép CB300-V/CB400)
    3. Tiên lượng HSMT theo Luật Xây dựng 2025 & Định mức 2026 (39 công tác)
    """
    try:
        service = get_drawing_takeoff_service()
        report = service.run_tri_source_reconciliation()
        return {
            "status": "success",
            "report": report.model_dump(),
        }
    except Exception as e:
        logger.exception("[TriSourceRoute] Audit failed")
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Lỗi kiểm toán Tri-Source: {e!s}",
        ) from e


@router.post(
    "/inverse-bim/solve",
    response_model=dict[str, Any],
    summary="Giải bài toán ràng buộc hình học nghịch đảo Inverse-BIM từ bản vẽ CAD",
)
def solve_inverse_bim_constraints(
    request: InverseBimSolveRequest,
    current_user: dict[str, Any] = Depends(_AUTHENTICATED_ROLE),  # noqa: B008
) -> dict[str, Any]:
    """Trích xuất ràng buộc tham số hình học và tính toán thể tích đặc từ vector CAD."""
    try:
        service = get_drawing_takeoff_service()
        kwargs = {}
        if request.num_segments:
            kwargs["num_segments"] = request.num_segments
        if request.segment_length_m:
            kwargs["segment_length_m"] = request.segment_length_m
        if request.structure_name:
            kwargs["structure_name"] = request.structure_name

        result = service.solve_inverse_bim_constraints(
            cad_source=request.cad_source_path,
            **kwargs,
        )
        return result
    except Exception as e:
        logger.exception("[InverseBimRoute] Solve failed")
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Lỗi Inverse-BIM Solver: {e!s}",
        ) from e


@router.post(
    "/tri-source/reconcile",
    response_model=dict[str, Any],
    summary="Thực thi đối soát 3 nguồn chân lý theo tham số chỉ định",
)
def reconcile_tri_source_endpoint(
    request: TriSourceReconcileRequest,
    current_user: dict[str, Any] = Depends(_AUTHENTICATED_ROLE),  # noqa: B008
) -> dict[str, Any]:
    """Đối soát khối lượng CAD, Thống kê thép BBS và Tiên lượng HSMT."""
    try:
        service = get_drawing_takeoff_service()
        report = service.run_tri_source_reconciliation(
            cad_source=request.cad_source_path,
            bbs_source=request.bbs_source_path,
            hsmt_source=request.hsmt_source_path,
            project_name=request.project_name or "",
            package_name=request.package_name or "",
        )
        return {
            "status": "success",
            "report": report.model_dump(),
        }
    except Exception as e:
        logger.exception("[TriSourceRoute] Reconcile failed")
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Lỗi đối soát Tri-Source: {e!s}",
        ) from e
