from __future__ import annotations

from typing import Any

from fastapi import APIRouter, Depends, HTTPException

from app.api.dependencies import get_qdrant_store
from app.modules.auth.presentation.auth import get_current_user, require_role
from app.models.schemas import (
    DossierCoverageResponse,
    DossierCriticalMissingItem,
    DossierDocumentIndexItem,
    DossierMissingDocumentItem,
    DossierReadinessResponse,
    DossierReadinessSummary,
    DossierStageReadiness,
    MissingDocumentGenerationRequest,
    MissingDocumentGenerationResponse,
)
from app.modules.dossier.application.dossier_report_service import DossierReportService
from app.modules.agents.application.missing_document_generation_service import (
    build_missing_document_generation_bundle,
)

router = APIRouter()


@router.get(
    "/v1/dossiers/{project_code}/coverage", response_model=DossierCoverageResponse
)
def dossier_coverage(
    project_code: str, current_user: dict[str, Any] = Depends(get_current_user)
) -> DossierCoverageResponse:
    """Return manifest-based dossier coverage report for a project code."""
    from app.modules.core.application.remediation_planning_service import RemediationPlanningService

    try:
        return RemediationPlanningService().get_project_coverage(project_code)
    except ValueError as exc:
        raise HTTPException(status_code=404, detail=str(exc)) from exc


@router.get(
    "/v1/dossiers/{project_code}/readiness", response_model=DossierReadinessResponse
)
def dossier_readiness(
    project_code: str, current_user: dict[str, Any] = Depends(get_current_user)
) -> DossierReadinessResponse:
    """Return dossier readiness report for a project code."""
    report_service = DossierReportService(get_qdrant_store())
    try:
        report = report_service.build_project_report(project_code)
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc

    document_index = {
        item["document_type"]: DossierDocumentIndexItem(**item)
        for item in report["document_index"].values()
    }
    documents_missing = {
        stage: [DossierMissingDocumentItem(**item) for item in items]
        for stage, items in report["documents_missing"].items()
    }
    critical_missing = [
        DossierCriticalMissingItem(**item) for item in report["critical_missing"]
    ]
    readiness = {
        stage: DossierStageReadiness(**item)
        for stage, item in report["readiness"].items()
    }

    return DossierReadinessResponse(
        project_code=report["project_code"],
        documents_present=report["documents_present"],
        document_index=document_index,
        documents_missing=documents_missing,
        critical_missing=critical_missing,
        readiness=readiness,
        summary=DossierReadinessSummary(**report["summary"]),
    )


@router.post(
    "/v1/dossiers/generate-missing",
    response_model=MissingDocumentGenerationResponse,
)
def generate_missing_dossier_documents(
    payload: MissingDocumentGenerationRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "site_engineer"])
    ),
) -> MissingDocumentGenerationResponse:
    """Tạo kế hoạch và placeholder content cho các hồ sơ còn thiếu."""
    bundle = build_missing_document_generation_bundle(
        project_code=payload.project_code,
        missing_document_types=payload.missing_document_types,
    )
    return MissingDocumentGenerationResponse(**bundle)


@router.post("/v1/dossiers/generate-template/{finding_id}")
def generate_dossier_template(
    finding_id: str,
    template_type: str = "bien_ban_nghiem_thu_noi_bo",
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "site_engineer"])
    ),
) -> dict[str, Any]:
    """Sinh biểu mẫu tài liệu điền sẵn thông tin hợp đồng cho hồ sơ còn thiếu."""
    from app.modules.dossier.application.dossier_generator_service import DossierGeneratorService

    service = DossierGeneratorService()
    res = service.generate_dossier_template(
        finding_id=finding_id, template_type=template_type
    )
    if "error" in res:
        raise HTTPException(status_code=400, detail=res["error"])
    return res
