"""
Dashboard Pydantic schemas — HWUI-001
"""
from enum import Enum
from datetime import datetime
from pydantic import BaseModel


class DateRangeEnum(str, Enum):
    TODAY = "today"
    LAST_7_DAYS = "last_7_days"
    LAST_10_DAYS = "last_10_days"
    LAST_30_DAYS = "last_30_days"
    LAST_90_DAYS = "last_90_days"
    THIS_MONTH = "this_month"
    LAST_3_MONTHS = "last_3_months"
    THIS_YEAR = "this_year"


# --- Summary / KPI ---

class DashboardSummaryResponse(BaseModel):
    total_revenue: float
    total_revenue_change_pct: float
    transaction_count: int
    transaction_count_change_pct: float
    refund_count: int
    refund_amount: float
    refund_rate_pct: float
    refund_rate_change_pct: float
    outstanding_invoice_count: int
    outstanding_invoice_amount: float
    net_revenue: float
    net_revenue_change_pct: float
    avg_transaction_value: float
    avg_transaction_value_change_pct: float
    active_customer_count: int
    active_customer_count_change_pct: float
    date_range: DateRangeEnum
    period_start: datetime
    period_end: datetime


# --- Revenue Trend ---

class RevenueTrendPoint(BaseModel):
    date: str
    amount: float
    transaction_count: int


class RevenueTrendResponse(BaseModel):
    data: list[RevenueTrendPoint]
    prior_period_data: list[RevenueTrendPoint]
    date_range: DateRangeEnum


# --- Payment Methods ---

class PaymentMethodDataPoint(BaseModel):
    method: str
    brand: str
    count: int
    amount: float
    percentage: float


class PaymentMethodsChartResponse(BaseModel):
    data: list[PaymentMethodDataPoint]
    total_count: int
    total_amount: float
    date_range: DateRangeEnum


# --- Transaction Status ---

class TransactionStatusDataPoint(BaseModel):
    status: str
    count: int
    amount: float


class TransactionStatusChartResponse(BaseModel):
    data: list[TransactionStatusDataPoint]
    date_range: DateRangeEnum


# --- Top Customers ---

class TopCustomerDataPoint(BaseModel):
    customer_id: int
    customer_name: str
    email: str
    transaction_count: int
    total_amount: float


class TopCustomersChartResponse(BaseModel):
    data: list[TopCustomerDataPoint]
    date_range: DateRangeEnum


# --- Action Items ---

class OverdueInvoiceItem(BaseModel):
    id: int
    invoice_id: str
    invoice_literal: str
    customer_name: str
    amount: float
    due_date: datetime
    days_overdue: int


class FailedTransactionItem(BaseModel):
    id: int
    txn_id: str
    customer_name: str
    amount: float
    occurred_at: datetime


class PendingAuthorizationItem(BaseModel):
    id: int
    authorization_id: str
    customer_name: str
    authorization_type: str
    created_at: datetime


class ActionItemsResponse(BaseModel):
    overdue_invoices: list[OverdueInvoiceItem]
    overdue_invoice_count: int
    failed_transactions: list[FailedTransactionItem]
    failed_transaction_count: int
    pending_authorizations: list[PendingAuthorizationItem]
    pending_authorization_count: int
