"""
Pydantic schemas for Dashboard and Analytics metrics.
"""

from datetime import date
from decimal import Decimal
from uuid import UUID

from pydantic import BaseModel, ConfigDict


class OperationalStats(BaseModel):
    """Operational volume and status progression metrics."""

    model_config = ConfigDict(from_attributes=True)

    total_patients: int = 0
    new_patients_period: int = 0
    total_orders: int = 0
    orders_by_status: dict[str, int] = {}
    pending_samples: int = 0
    pending_verifications: int = 0
    today_appointments: int = 0
    appointments_by_status: dict[str, int] = {}


class FinancialStats(BaseModel):
    """Revenue, collections, receivables, and partner liability metrics."""

    model_config = ConfigDict(from_attributes=True)

    total_invoiced: Decimal = Decimal("0.00")
    total_collected: Decimal = Decimal("0.00")
    total_outstanding: Decimal = Decimal("0.00")
    total_discounts: Decimal = Decimal("0.00")
    revenue_by_tender: dict[str, Decimal] = {}
    accrued_commissions: Decimal = Decimal("0.00")
    unsettled_commissions: Decimal = Decimal("0.00")
    radiologist_accrued_commissions: Decimal = Decimal("0.00")
    radiologist_unsettled_commissions: Decimal = Decimal("0.00")


class DailyTimeSeriesPoint(BaseModel):
    """Single date point for analytics chart rendering."""

    date: str
    order_count: int = 0
    revenue: Decimal = Decimal("0.00")
    invoiced_amount: Decimal = Decimal("0.00")
    invoice_count: int = 0
    patient_count: int = 0


class TopItemMetric(BaseModel):
    """Volume and monetary contribution of catalog tests or packages."""

    id: UUID
    name: str
    code: str
    count: int = 0
    total_value: Decimal = Decimal("0.00")


class TopReferralMetric(BaseModel):
    """Top referral partner performance."""

    id: UUID
    name: str
    type: str
    referral_count: int = 0
    commission_earned: Decimal = Decimal("0.00")


class TopPerformersResponse(BaseModel):
    """Collection of top tests, packages, and referring entities."""

    top_tests: list[TopItemMetric] = []
    top_packages: list[TopItemMetric] = []
    top_referrers: list[TopReferralMetric] = []


class DashboardOverviewResponse(BaseModel):
    """Consolidated executive dashboard response."""

    period_start: date
    period_end: date
    lab_id: UUID | None = None
    operational: OperationalStats
    financial: FinancialStats
    trend: list[DailyTimeSeriesPoint] = []
    top_tests: list[TopItemMetric] = []
    top_packages: list[TopItemMetric] = []
    top_referrers: list[TopReferralMetric] = []
