"""
Waitlist schemas for API requests and responses.
"""
from typing import Optional
from datetime import date, datetime
from pydantic import BaseModel, Field, EmailStr

from app.models.waitlist import WaitlistStatus, WaitlistPriority


class WaitlistBase(BaseModel):
    """Base waitlist schema."""
    check_in_date: date
    check_out_date: date
    room_type_id: Optional[int] = None
    adults: int = Field(1, ge=1, le=10)
    children: int = Field(0, ge=0, le=10)
    priority: WaitlistPriority = WaitlistPriority.NORMAL
    notes: Optional[str] = None


class WaitlistCreate(WaitlistBase):
    """Schema for creating a waitlist entry."""
    establishment_id: int
    client_id: Optional[int] = None  # If None, use contact fields
    contact_name: Optional[str] = Field(None, max_length=200)
    contact_email: Optional[EmailStr] = None
    contact_phone: Optional[str] = Field(None, max_length=50)


class WaitlistUpdate(BaseModel):
    """Schema for updating a waitlist entry."""
    priority: Optional[WaitlistPriority] = None
    status: Optional[WaitlistStatus] = None
    notes: Optional[str] = None
    room_type_id: Optional[int] = None


class WaitlistResponse(WaitlistBase):
    """Schema for waitlist response."""
    id: int
    establishment_id: int
    client_id: Optional[int] = None
    status: WaitlistStatus
    contact_name: Optional[str] = None
    contact_email: Optional[str] = None
    contact_phone: Optional[str] = None
    contacted_at: Optional[date] = None
    contacted_by_id: Optional[int] = None
    converted_reservation_id: Optional[int] = None
    created_at: datetime
    updated_at: datetime

    # Display properties
    display_name: str
    display_contact: str

    class Config:
        from_attributes = True


class WaitlistConvert(BaseModel):
    """Schema for converting waitlist to reservation."""
    room_id: int
    total_price: float
    notes: Optional[str] = None


class WaitlistStatistics(BaseModel):
    """Statistics for waitlist entries."""
    total: int
    pending: int
    contacted: int
    converted: int
    cancelled: int
    expired: int
    by_priority: dict[str, int]
    average_wait_days: float
