"""API Router for the 4 Core Business Pillars of Cong ty TNHH Xay Dung Dinh Son (0202111150)."""

from __future__ import annotations

from typing import Any

from fastapi import APIRouter, Depends, HTTPException, Query

from app.modules.auth.presentation.auth import get_current_user, require_role
from app.models.four_pillars_schemas import (
    DispatchOrderCreateRequest,
    DispatchOrderRecord,
    IPC03aExportRequest,
    IPCDocumentDetail,
    MaterialLossAuditRecord,
    QualityCertAuditSummaryResponse,
    RentalContractReconciliation,
    SludgeTransportReconciliation,
    ThreeWayMatchDetailResponse,
)
from app.modules.financial.application.four_pillars_service import FourPillarsService

router = APIRouter(
    prefix="/v1/pillars", tags=["4 Trụ Cột Kinh Doanh Định Sơn (0202111150)"]
)
service = FourPillarsService()


# --------------------------------------------------------------------------
# TRỤ CỘT 1: THI CÔNG XÂY LẮP & THỦY LỢI (EPC)
# --------------------------------------------------------------------------
@router.post(
    "/epc/ipc/export-03a",
    response_model=IPCDocumentDetail,
    summary="[Trụ Cột 1] Xuất hồ sơ nghiệm thu thanh toán IPC Phụ lục 03.a (Nghị định 206/2026/NĐ-CP)",
)
def export_ipc_03a(
    payload: IPC03aExportRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "qs"])
    ),
) -> IPCDocumentDetail:
    """Tạo hồ sơ đề nghị thanh toán IPC 03.a với đầy đủ khấu trừ tạm ứng và Retention bảo hành."""
    try:
        return service.generate_ipc_document(payload)
    except Exception as exc:
        raise HTTPException(
            status_code=500, detail=f"Lỗi xuất hồ sơ IPC: {exc!s}"
        ) from exc


@router.get(
    "/epc/3-way-match/{project_code}",
    response_model=list[ThreeWayMatchDetailResponse],
    summary="[Trụ Cột 1] Đối soát 3 bên (BOQ Thiết kế vs Nghiệm thu vs Hóa đơn)",
)
def get_3way_matching(
    project_code: str,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "accountant", "qs"])
    ),
) -> list[ThreeWayMatchDetailResponse]:
    """Truy xuất chi tiết đối soát 3-Way Matching giữa Thiết kế, Thực tế và Hóa đơn."""
    return service.get_3way_matching_details(project_code=project_code)


# --------------------------------------------------------------------------
# TRỤ CỘT 2: DỊCH VỤ VẬN TẢI XE BEN & LOGISTICS (THOÁT NƯỚC HP 0200149705)
# --------------------------------------------------------------------------
@router.post(
    "/logistics/dispatch-orders",
    response_model=DispatchOrderRecord,
    summary="[Trụ Cột 2] Tạo lệnh điều xe ben Howo 4 chân vận chuyển bùn nạo vét",
)
def create_dispatch_order(
    payload: DispatchOrderCreateRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "fleet_manager", "pm"])
    ),
) -> DispatchOrderRecord:
    """Lập lệnh điều xe ben Howo chở bùn đất và tính định mức nhiên liệu chuẩn 2026."""
    return service.create_dispatch_order(payload)


@router.get(
    "/logistics/sludge-transport/reconcile",
    response_model=SludgeTransportReconciliation,
    summary="[Trụ Cột 2] Đối soát dịch vụ vận chuyển bùn nạo vét với Cty Thoát Nước Hải Phòng (0200149705)",
)
def reconcile_sludge_transport(
    billing_period: str = Query(default="2026-Q1", description="Kỳ thanh toán"),
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "fleet_manager", "pm", "accountant"])
    ),
) -> SludgeTransportReconciliation:
    """Đối soát vé cân trạm đổ Đình Vũ với hóa đơn cước vận chuyển xuất cho Cty Thoát Nước HP."""
    return service.reconcile_sludge_transport(billing_period=billing_period)


# --------------------------------------------------------------------------
# TRỤ CỘT 3: CHO THUÊ MÁY MÓC & CA MÁY (LOAN KHẢI 0201889988)
# --------------------------------------------------------------------------
@router.get(
    "/equipment/rental-reconcile",
    response_model=RentalContractReconciliation,
    summary="[Trụ Cột 3] Đối soát 3 bên cho thuê máy đào Kobelco/Komatsu (Cty Loan Khải 0201889988)",
)
def reconcile_equipment_rental(
    equipment_code: str = Query(
        default="EXC-KOBELCO-02", description="Mã thiết bị cho thuê"
    ),
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "accountant"])
    ),
) -> RentalContractReconciliation:
    """Đối soát 3 bên: Nhật ký ca máy, Chấm công thợ và Hóa đơn cho thuê máy xuất cho Cty Loan Khải."""
    return service.reconcile_equipment_rental(equipment_code=equipment_code)


# --------------------------------------------------------------------------
# TRỤ CỘT 4: MUA BÁN VẬT TƯ & SAN LẤP (TRUNG KIÊN 0201805660)
# --------------------------------------------------------------------------
@router.get(
    "/materials/loss-audit",
    response_model=list[MaterialLossAuditRecord],
    summary="[Trụ Cột 4] Kiểm toán tỷ lệ hao hụt vật tư Cát/Đá/Xi măng (Cty Trung Kiên 0201805660)",
)
def audit_material_loss(
    supplier_tax_id: str = Query(
        default="0201805660", description="Mã số thuế Nhà cung cấp"
    ),
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "accountant", "qs"])
    ),
) -> list[MaterialLossAuditRecord]:
    """Kiểm toán tỷ lệ hao hụt khối lượng vật tư mua vào so với Định mức 12/2021/BXD & 2026."""
    return service.audit_material_loss(supplier_tax_id=supplier_tax_id)


@router.get(
    "/materials/quality-certificates/audit",
    response_model=QualityCertAuditSummaryResponse,
    summary="[Trụ Cột 4] Rà soát điều kiện thanh toán: Chứng chỉ CO/CQ & Kết quả nén mẫu R28 / Kéo thép",
)
def audit_quality_certificates(
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "qs", "site_engineer"])
    ),
) -> QualityCertAuditSummaryResponse:
    """Rà soát và cảnh báo các hóa đơn vật tư chưa đủ chứng chỉ CO/CQ hoặc thí nghiệm nén mẫu."""
    return service.audit_quality_certificates()
