"""
Dashboard and executive analytics endpoints.
"""

from datetime import date
from typing import Annotated
from uuid import UUID

from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.auth_deps import require_permission
from app.core.dependencies import get_db
from app.core.permissions import PermissionCode
from app.core.responses import SuccessResponse
from app.models.user import User
from app.schemas.dashboard import (
    DailyTimeSeriesPoint,
    DashboardOverviewResponse,
    FinancialStats,
    OperationalStats,
    TopPerformersResponse,
)
from app.services.dashboard_service import DashboardService

router = APIRouter(prefix="/dashboard", tags=["Dashboard & Analytics"])
_dashboard_service = DashboardService()


@router.get(
    "/overview",
    response_model=SuccessResponse[DashboardOverviewResponse],
    summary="Get consolidated executive dashboard overview",
)
async def get_overview(
    db: Annotated[AsyncSession, Depends(get_db)],
    current_user: Annotated[User, Depends(require_permission(PermissionCode.DASHBOARD_READ))],
    start_date: Annotated[date | None, Query(description="Start date (YYYY-MM-DD)")] = None,
    end_date: Annotated[date | None, Query(description="End date (YYYY-MM-DD)")] = None,
    lab_id: Annotated[UUID | None, Query(description="Lab Branch UUID filter (Superadmin only)")] = None,
    refresh: Annotated[bool, Query(description="Bypass cache and force recalculation")] = False,
) -> SuccessResponse[DashboardOverviewResponse]:
    """Retrieve operational volume, financial summary, trend series, and top performers."""
    data = await _dashboard_service.get_overview(
        db=db,
        user=current_user,
        start_date=start_date,
        end_date=end_date,
        requested_lab_id=lab_id,
        refresh=refresh,
    )
    return SuccessResponse(data=data)


@router.get(
    "/operational",
    response_model=SuccessResponse[OperationalStats],
    summary="Get operational volume and workflow status metrics",
)
async def get_operational(
    db: Annotated[AsyncSession, Depends(get_db)],
    current_user: Annotated[User, Depends(require_permission(PermissionCode.DASHBOARD_READ))],
    start_date: Annotated[date | None, Query(description="Start date (YYYY-MM-DD)")] = None,
    end_date: Annotated[date | None, Query(description="End date (YYYY-MM-DD)")] = None,
    lab_id: Annotated[UUID | None, Query(description="Lab Branch UUID filter (Superadmin only)")] = None,
    refresh: Annotated[bool, Query(description="Bypass cache and force recalculation")] = False,
) -> SuccessResponse[OperationalStats]:
    """Retrieve patient counts, order status funnel, sample backlog, and pending verification queues."""
    data = await _dashboard_service.get_operational_stats(
        db=db,
        user=current_user,
        start_date=start_date,
        end_date=end_date,
        requested_lab_id=lab_id,
        refresh=refresh,
    )
    return SuccessResponse(data=data)


@router.get(
    "/financial",
    response_model=SuccessResponse[FinancialStats],
    summary="Get financial revenue, collection, and commission metrics",
)
async def get_financial(
    db: Annotated[AsyncSession, Depends(get_db)],
    current_user: Annotated[User, Depends(require_permission(PermissionCode.DASHBOARD_READ))],
    start_date: Annotated[date | None, Query(description="Start date (YYYY-MM-DD)")] = None,
    end_date: Annotated[date | None, Query(description="End date (YYYY-MM-DD)")] = None,
    lab_id: Annotated[UUID | None, Query(description="Lab Branch UUID filter (Superadmin only)")] = None,
    refresh: Annotated[bool, Query(description="Bypass cache and force recalculation")] = False,
) -> SuccessResponse[FinancialStats]:
    """Retrieve billed revenue, collections, outstanding receivables, and referral commissions."""
    data = await _dashboard_service.get_financial_stats(
        db=db,
        user=current_user,
        start_date=start_date,
        end_date=end_date,
        requested_lab_id=lab_id,
        refresh=refresh,
    )
    return SuccessResponse(data=data)


@router.get(
    "/trends",
    response_model=SuccessResponse[list[DailyTimeSeriesPoint]],
    summary="Get daily time-series trends for charts",
)
async def get_trends(
    db: Annotated[AsyncSession, Depends(get_db)],
    current_user: Annotated[User, Depends(require_permission(PermissionCode.DASHBOARD_READ))],
    start_date: Annotated[date | None, Query(description="Start date (YYYY-MM-DD)")] = None,
    end_date: Annotated[date | None, Query(description="End date (YYYY-MM-DD)")] = None,
    lab_id: Annotated[UUID | None, Query(description="Lab Branch UUID filter (Superadmin only)")] = None,
    refresh: Annotated[bool, Query(description="Bypass cache and force recalculation")] = False,
) -> SuccessResponse[list[DailyTimeSeriesPoint]]:
    """Retrieve contiguous daily order count, revenue, and patient volume time-series data."""
    data = await _dashboard_service.get_daily_trends(
        db=db,
        user=current_user,
        start_date=start_date,
        end_date=end_date,
        requested_lab_id=lab_id,
        refresh=refresh,
    )
    return SuccessResponse(data=data)


@router.get(
    "/top-performers",
    response_model=SuccessResponse[TopPerformersResponse],
    summary="Get top tests, packages, and referral partners",
)
async def get_top_performers(
    db: Annotated[AsyncSession, Depends(get_db)],
    current_user: Annotated[User, Depends(require_permission(PermissionCode.DASHBOARD_READ))],
    start_date: Annotated[date | None, Query(description="Start date (YYYY-MM-DD)")] = None,
    end_date: Annotated[date | None, Query(description="End date (YYYY-MM-DD)")] = None,
    lab_id: Annotated[UUID | None, Query(description="Lab Branch UUID filter (Superadmin only)")] = None,
    refresh: Annotated[bool, Query(description="Bypass cache and force recalculation")] = False,
) -> SuccessResponse[TopPerformersResponse]:
    """Retrieve top 5 diagnostic tests, wellness packages, and referral partners."""
    data = await _dashboard_service.get_top_performers(
        db=db,
        user=current_user,
        start_date=start_date,
        end_date=end_date,
        requested_lab_id=lab_id,
        refresh=refresh,
    )
    return SuccessResponse(data=data)
