"""
Room and RoomType schemas.
"""
from typing import Optional, List
from datetime import datetime, date
from pydantic import BaseModel, Field

from app.models.room import RoomStatus


class RoomTypeBase(BaseModel):
    """Base room type schema."""
    name: str = Field(..., min_length=1, max_length=100)
    name_en: Optional[str] = Field(None, max_length=100)
    code: str = Field(..., min_length=1, max_length=10)
    capacity_adults: int = Field(2, ge=1)
    capacity_children: int = Field(0, ge=0)
    capacity_beds: int = Field(1, ge=1)
    base_price: float = Field(0.0, ge=0)
    description: Optional[str] = None
    description_en: Optional[str] = None
    amenities: Optional[str] = None


class RoomTypeCreate(RoomTypeBase):
    """Schema for creating a room type."""
    establishment_id: int


class RoomTypeUpdate(BaseModel):
    """Schema for updating a room type."""
    name: Optional[str] = Field(None, min_length=1, max_length=100)
    name_en: Optional[str] = Field(None, max_length=100)
    code: Optional[str] = Field(None, min_length=1, max_length=10)
    capacity_adults: Optional[int] = Field(None, ge=1)
    capacity_children: Optional[int] = Field(None, ge=0)
    capacity_beds: Optional[int] = Field(None, ge=1)
    base_price: Optional[float] = Field(None, ge=0)
    description: Optional[str] = None
    description_en: Optional[str] = None
    amenities: Optional[str] = None
    is_active: Optional[bool] = None


class RoomTypeResponse(RoomTypeBase):
    """Schema for room type response."""
    id: int
    establishment_id: int
    is_active: bool
    total_capacity: int
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class RoomBase(BaseModel):
    """Base room schema."""
    room_number: str = Field(..., min_length=1, max_length=20)
    floor: int = Field(0)
    notes: Optional[str] = None


class RoomCreate(RoomBase):
    """Schema for creating a room."""
    establishment_id: int
    room_type_id: int


class RoomUpdate(BaseModel):
    """Schema for updating a room."""
    room_number: Optional[str] = Field(None, min_length=1, max_length=20)
    room_type_id: Optional[int] = None
    floor: Optional[int] = None
    status: Optional[RoomStatus] = None
    notes: Optional[str] = None
    is_active: Optional[bool] = None


class RoomResponse(RoomBase):
    """Schema for room response."""
    id: int
    establishment_id: int
    room_type_id: int
    status: RoomStatus
    is_active: bool
    room_type: Optional[RoomTypeResponse] = None
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class RoomAvailability(BaseModel):
    """Schema for room availability check."""
    room_id: int
    room_number: str
    room_type: str
    is_available: bool
    current_status: RoomStatus
    next_reservation_date: Optional[date] = None


class RoomAvailabilityQuery(BaseModel):
    """Schema for querying room availability."""
    check_in_date: date
    check_out_date: date
    room_type_id: Optional[int] = None
    adults: Optional[int] = Field(None, ge=1)
    children: Optional[int] = Field(None, ge=0)
