"""
Report schemas for analytics and KPIs.
"""
from typing import Optional, List, Dict
from datetime import date
from pydantic import BaseModel, Field


class DashboardKPIs(BaseModel):
    """Real-time dashboard KPIs."""
    # Today's metrics
    date: date
    rooms_available: int
    rooms_sold: int
    rooms_out_of_order: int
    occupancy_rate: float
    arrivals_today: int
    departures_today: int
    in_house_guests: int

    # Financial metrics (today)
    revenue_today: float
    revenue_accommodation: float
    revenue_fb: float
    revenue_other: float

    # Key indicators
    adr: float
    revpar: float
    average_guest_revenue: float

    # Comparison with previous period
    occupancy_rate_change: Optional[float] = None
    revenue_change: Optional[float] = None
    adr_change: Optional[float] = None


class DepartmentRevenue(BaseModel):
    """Revenue by department."""
    department_code: str
    department_name: str
    revenue_ht: float
    revenue_ttc: float
    percentage: float


class DailyReportResponse(BaseModel):
    """Daily operational report."""
    date: date
    establishment_id: int
    establishment_name: str

    # Room statistics
    rooms_available: int
    rooms_sold: int
    rooms_complimentary: int
    rooms_out_of_order: int
    occupancy_rate: float

    # Guest statistics
    arrivals: int
    departures: int
    no_shows: int
    cancellations: int
    in_house: int
    nights_sold: int

    # Revenue breakdown
    revenue_by_department: List[DepartmentRevenue]
    total_revenue_ht: float
    total_tax: float
    total_revenue_ttc: float

    # KPIs
    adr: float
    revpar: float
    frequency_index: float
    average_guest_revenue: float

    # Payment summary
    payments_by_method: Dict[str, float]
    total_payments: float


class MonthlyReportResponse(BaseModel):
    """Monthly summary report."""
    year: int
    month: int
    establishment_id: int
    establishment_name: str

    # Room statistics
    total_rooms_available: int
    total_rooms_sold: int
    average_occupancy_rate: float
    total_nights_sold: int

    # Guest statistics
    total_arrivals: int
    total_departures: int
    total_no_shows: int
    total_cancellations: int

    # Revenue
    revenue_by_department: List[DepartmentRevenue]
    total_revenue_ht: float
    total_tax: float
    total_revenue_ttc: float

    # KPIs
    average_adr: float
    average_revpar: float
    average_frequency_index: float
    average_guest_revenue: float

    # Daily breakdown
    daily_stats: List[dict]


class PeriodComparison(BaseModel):
    """Period comparison (N vs N-1 vs Budget)."""
    period_label: str
    current_value: float
    previous_value: Optional[float] = None
    budget_value: Optional[float] = None
    variance_vs_previous: Optional[float] = None
    variance_vs_budget: Optional[float] = None
    variance_percent_previous: Optional[float] = None
    variance_percent_budget: Optional[float] = None


class KPIComparison(BaseModel):
    """KPI comparison across periods."""
    kpi_name: str
    kpi_label: str
    current: PeriodComparison
    unit: str = ""


class AnnualReportResponse(BaseModel):
    """Annual summary report."""
    year: int
    establishment_id: int
    establishment_name: str

    # Summary metrics
    total_rooms_sold: int
    total_nights_sold: int
    average_occupancy_rate: float
    total_revenue: float

    # KPIs
    average_adr: float
    average_revpar: float

    # Monthly breakdown
    monthly_stats: List[dict]

    # Comparisons
    kpi_comparisons: List[KPIComparison]


class ExportRequest(BaseModel):
    """Schema for export request."""
    report_type: str = Field(..., pattern="^(daily|monthly|annual)$")
    start_date: date
    end_date: date
    format: str = Field("excel", pattern="^(excel|pdf|csv)$")
    include_formulas: bool = True
