"""API endpoints for Treasury Settlement Dossier (Mẫu 03.a/TT & Mẫu 03.c/TT Nghị định 254/2025/NĐ-CP).
Strict RBAC & Enterprise AEC Architecture COMPLIANT.
"""

from __future__ import annotations

import logging
from typing import Any
from fastapi import APIRouter, Depends, HTTPException, Query, Response
from fastapi.responses import HTMLResponse

from app.modules.auth.presentation.auth import get_current_user, require_role
from app.modules.dossier.application.treasury_settlement_service import TreasurySettlementService

logger = logging.getLogger(__name__)

router = APIRouter(
    prefix="/v1/erp/dossier/treasury",
    tags=["ERP - Treasury Settlement Dossier (Kho Bạc Nhà Nước NĐ 254/2025/NĐ-CP)"],
    dependencies=[Depends(require_role(["superadmin", "director", "pm", "accountant", "qs"]))],
)


@router.get("/data", summary="Lấy dữ liệu JSON Hồ sơ Thanh toán Kho bạc Mẫu 03.a / 03.c")
def get_treasury_data(
    project_code: str = Query(..., description="Mã dự án (ví dụ: DA-2608281122 hoặc DA-2026-32)"),
    stage_number: int = Query(1, ge=1, le=10, description="Đợt thanh toán (1, 2, 3...)"),
    form_type: str = Query("03a", description="Loại biểu mẫu: '03a' (theo HĐ) hoặc '03c' (phát sinh ngoài HĐ)"),
    current_user: dict[str, Any] = Depends(get_current_user),
) -> dict[str, Any]:
    """Truy xuất dữ liệu cấu trúc Mẫu 03.a/TT hoặc Mẫu 03.c/TT để render Live Preview."""
    try:
        service = TreasurySettlementService()
        return service.get_treasury_data(project_code, stage_number, form_type)
    except ValueError as exc:
        raise HTTPException(status_code=404, detail=str(exc))
    except Exception as exc:
        logger.error(f"Lỗi truy xuất Mẫu {form_type}: {exc}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {exc!s}")


@router.get("/preview-html", response_class=HTMLResponse, summary="Xem trực tiếp Live Preview HTML Mẫu 03.a / 03.c")
def preview_treasury_html(
    project_code: str = Query(..., description="Mã dự án"),
    stage_number: int = Query(1, ge=1, le=10, description="Đợt thanh toán"),
    form_type: str = Query("03a", description="Loại biểu mẫu: '03a' (theo HĐ) hoặc '03c' (phát sinh ngoài HĐ)"),
    current_user: dict[str, Any] = Depends(get_current_user),
) -> HTMLResponse:
    """Trả về trang HTML sắc nét để preview trong iframe hoặc in trực tiếp A4 ngang."""
    try:
        service = TreasurySettlementService()
        html_content = service.render_treasury_html(project_code, stage_number, form_type)
        return HTMLResponse(content=html_content, status_code=200)
    except ValueError as exc:
        raise HTTPException(status_code=404, detail=str(exc))
    except Exception as exc:
        logger.error(f"Lỗi preview HTML Mẫu {form_type}: {exc}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {exc!s}")


@router.get("/export-excel", summary="1-Click Tải file Excel Mẫu 03.a / 03.c (.xlsx)")
def export_treasury_excel(
    project_code: str = Query(..., description="Mã dự án"),
    stage_number: int = Query(1, ge=1, le=10, description="Đợt thanh toán"),
    form_type: str = Query("03a", description="Loại biểu mẫu: '03a' hoặc '03c'"),
    current_user: dict[str, Any] = Depends(get_current_user),
) -> Response:
    """Xuất file Excel Mẫu 03.a/TT hoặc Mẫu 03.c/TT hoàn chỉnh để nộp Kho bạc Nhà nước."""
    try:
        service = TreasurySettlementService()
        excel_bytes = service.export_treasury_excel(project_code, stage_number, form_type)
        filename = f"Mau_{form_type.upper()}_KhoBac_{project_code}_Dot{stage_number}.xlsx"
        return Response(
            content=excel_bytes,
            media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            headers={"Content-Disposition": f"attachment; filename={filename}"}
        )
    except ValueError as exc:
        raise HTTPException(status_code=404, detail=str(exc))
    except Exception as exc:
        logger.error(f"Lỗi xuất Excel Mẫu {form_type}: {exc}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {exc!s}")


# =============================================================================
# BACKWARDS-COMPATIBILITY ROUTES (Giữ tương thích cho endpoint treasury-02a cũ)
# =============================================================================
compat_router = APIRouter(
    prefix="/v1/erp/dossier/treasury-02a",
    tags=["ERP - Treasury Settlement Dossier (Compat Alias)"],
    dependencies=[Depends(require_role(["superadmin", "director", "pm", "accountant", "qs"]))],
)

@compat_router.get("/data", include_in_schema=False)
def get_treasury_02a_data_compat(
    project_code: str = Query(...),
    stage_number: int = Query(1),
    current_user: dict[str, Any] = Depends(get_current_user),
):
    return get_treasury_data(project_code=project_code, stage_number=stage_number, form_type="03a", current_user=current_user)

@compat_router.get("/preview-html", response_class=HTMLResponse, include_in_schema=False)
def preview_treasury_02a_html_compat(
    project_code: str = Query(...),
    stage_number: int = Query(1),
    current_user: dict[str, Any] = Depends(get_current_user),
):
    return preview_treasury_html(project_code=project_code, stage_number=stage_number, form_type="03a", current_user=current_user)

@compat_router.get("/export-excel", include_in_schema=False)
def export_treasury_02a_excel_compat(
    project_code: str = Query(...),
    stage_number: int = Query(1),
    current_user: dict[str, Any] = Depends(get_current_user),
):
    return export_treasury_excel(project_code=project_code, stage_number=stage_number, form_type="03a", current_user=current_user)
