"""FastAPI Router for Executive Financial War Room & Cashflow Runway."""

from __future__ import annotations

from datetime import date

from fastapi import APIRouter, Depends, Query

from app.modules.auth.presentation.auth import require_role
from app.models.financial_war_room_schemas import (
    CashflowRunwaySummary,
    ExecutiveWarRoomData,
    PillarFinancialSummary,
)
from app.modules.financial.application.financial_war_room_service import FinancialWarRoomService

router = APIRouter(
    prefix="/v1/war-room",
    tags=["Financial War Room"],
    dependencies=[Depends(require_role(["superadmin", "director", "accountant"]))],
)
service = FinancialWarRoomService()


@router.get("/summary", response_model=ExecutiveWarRoomData)
def get_war_room_summary(
    as_of_date: date | None = Query(
        None, description="Ngày chốt số liệu (mặc định hôm nay)"
    ),
    client_delay_days: int = Query(
        0, description="Số ngày CĐT chậm thanh toán (Stress Test)"
    ),
) -> ExecutiveWarRoomData:
    """Lấy dữ liệu hợp nhất Bảng Điều Hành Tài Chính & Dòng Tiền 4 Trụ Cột."""
    from app.core.postgres.project_crud.repository import ProjectCrudRepository

    service = FinancialWarRoomService(postgres_client=ProjectCrudRepository())
    return service.get_war_room_summary(
        as_of_date=as_of_date, client_delay_days=client_delay_days
    )


@router.get("/pillars", response_model=list[PillarFinancialSummary])
def get_pillars_breakdown() -> list[PillarFinancialSummary]:
    """Lấy chi tiết doanh thu, chi phí, công nợ 4 Trụ Cột Doanh Nghiệp."""
    from app.core.postgres.project_crud.repository import ProjectCrudRepository

    service = FinancialWarRoomService(postgres_client=ProjectCrudRepository())
    data = service.get_war_room_summary()
    return data.pillars_breakdown


@router.get("/cashflow", response_model=CashflowRunwaySummary)
def get_cashflow_runway(
    client_delay_days: int = Query(
        0, description="Số ngày CĐT chậm thanh toán (Stress Test)"
    ),
) -> CashflowRunwaySummary:
    """Lấy dự báo dòng tiền 30 ngày tới và số ngày dự phòng an toàn."""
    from app.core.postgres.project_crud.repository import ProjectCrudRepository

    service = FinancialWarRoomService(postgres_client=ProjectCrudRepository())
    data = service.get_war_room_summary(client_delay_days=client_delay_days)
    return data.cashflow_runway


@router.get("/evm-metrics")
def get_evm_metrics(
    project_code: str = Query(..., description="Mã dự án để xem báo cáo EVM"),
) -> dict:
    """Lấy chỉ số EVM (Earned Value Management) gồm SPI và CPI thông qua Application Service."""
    service = FinancialWarRoomService()
    return service.get_project_evm_metrics(project_code)
