"""Generation preview routes for DSCons."""

from typing import Any

from fastapi import APIRouter, Depends, HTTPException, Query

from app.modules.auth.presentation.auth import get_current_user
from app.models.dossier_schemas import BienBanBanGiaoMatBangGenerationPreviewResponse
from app.modules.agents.application.generation_payload_assembler import (
    assemble_bien_ban_ban_giao_mat_bang_generation_payload,
)
from app.modules.projects.application.project_management_service import ProjectManagementService

router = APIRouter()


@router.get(
    "/internal/generation/bien-ban-ban-giao-mat-bang/preview",
    response_model=BienBanBanGiaoMatBangGenerationPreviewResponse,
)
def generation_preview_bien_ban_ban_giao_mat_bang(
    project_code: str | None = Query(
        default=None,
        description="Mã dự án nguồn để build preview từ dữ liệu thực tế hoặc dữ liệu đã chuẩn hóa.",
    ),
    use_sample: bool = Query(
        default=False,
        description="Dùng payload mẫu nội bộ khi chưa truyền project_code.",
    ),
    current_user: dict[str, Any] = Depends(get_current_user),
) -> BienBanBanGiaoMatBangGenerationPreviewResponse:
    """Trả preview nội bộ cho workflow generation pilot biên bản bàn giao mặt bằng."""
    if not project_code and not use_sample:
        raise HTTPException(
            status_code=400,
            detail="Cần truyền project_code hoặc use_sample=true.",
        )

    if project_code:
        project_management = ProjectManagementService().get_project_management_data()
        matched_project = next(
            (
                item
                for item in project_management.items
                if item.project_code.strip().lower() == project_code.strip().lower()
            ),
            None,
        )
        if matched_project is None:
            raise HTTPException(
                status_code=404,
                detail=f"Không tìm thấy dữ liệu dự án cho project_code={project_code}.",
            )
        source_data = matched_project.model_dump(exclude_none=True)
        source_note = "preview built from project management data"
    else:
        # Giữ payload mẫu cũ để không đổi hành vi preview nội bộ.
        source_data = {
            "project_code": "SAMPLE-DSCONS-001",
            "project_name": "Dự án cải tạo tuyến đường nội thị khu A",
            "dossier_code": "12/BBBGMB-2026",
            "handover_date_text": "Ngày 15 tháng 03 năm 2026",
            "handover_location": "Tại hiện trường dự án phường Tân Lập, thành phố Buôn Ma Thuột",
            "site_description": "Bàn giao toàn bộ mặt bằng thi công đoạn Km0+000 đến Km0+500 đã hoàn tất công tác giải phóng mặt bằng",
            "handing_over_organization": {
                "name": "Ban Quản lý dự án đầu tư xây dựng thành phố",
                "address": "Số 12 Lê Duẩn, thành phố Buôn Ma Thuột, Đắk Lắk",
                "representative_name": "Nguyễn Văn A",
                "representative_title": "Giám đốc Ban Quản lý dự án",
            },
            "receiving_organization": {
                "name": "Công ty Cổ phần Xây dựng Minh Phát",
                "address": "Số 45 Nguyễn Tất Thành, thành phố Buôn Ma Thuột, Đắk Lắk",
                "representative_name": "Trần Văn B",
                "representative_title": "Chỉ huy trưởng công trình",
            },
            "extra_context": {
                "handover_notes": "Nhà thầu có trách nhiệm tiếp nhận và tổ chức rào chắn an toàn trước khi thi công.",
                "legal_basis_summary": "Căn cứ Hợp đồng thi công số 05/HĐTC ngày 10/03/2026 và kế hoạch triển khai đã được phê duyệt.",
            },
        }
        source_note = "preview built from sample data"

    try:
        payload = assemble_bien_ban_ban_giao_mat_bang_generation_payload(source_data)
    except ValueError as exc:
        raise HTTPException(status_code=503, detail=str(exc)) from exc

    return BienBanBanGiaoMatBangGenerationPreviewResponse(
        payload=payload,
        field_statuses=payload.field_statuses,
        readiness=payload.readiness,
        active_template=payload.template,
        review_workflow=payload.review_workflow,
        source_project_code=project_code or source_data.get("project_code"),
        source_note=source_note,
    )
