"""
Schemas for Laboratory Operating Schedule and Holiday / Closure Management.
"""

from datetime import date, datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


class LabScheduleConfigBase(BaseModel):
    open_time: str = Field(default="07:00", description="Opening time HH:MM format", pattern=r"^\d{2}:\d{2}$")
    close_time: str = Field(
        default="19:00", description="Closing time HH:MM format", pattern=r"^\d{2}:\d{2}$"
    )
    slot_duration_minutes: int = Field(default=30, ge=10, le=120, description="Duration in minutes per slot")
    slot_capacity: int = Field(default=2, ge=1, le=50, description="Max patient bookings per slot")
    operating_days: str = Field(default="0,1,2,3,4,5,6", description="Operating weekdays (0=Mon, ..., 6=Sun)")
    is_active: bool = Field(default=True, description="Whether booking is active")


class LabScheduleConfigUpdate(BaseModel):
    open_time: str | None = Field(default=None, pattern=r"^\d{2}:\d{2}$")
    close_time: str | None = Field(default=None, pattern=r"^\d{2}:\d{2}$")
    slot_duration_minutes: int | None = Field(default=None, ge=10, le=120)
    slot_capacity: int | None = Field(default=None, ge=1, le=50)
    operating_days: str | None = None
    is_active: bool | None = None


class LabScheduleConfigResponse(LabScheduleConfigBase):
    id: UUID
    lab_id: UUID
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class LabHolidayCreate(BaseModel):
    start_date: date = Field(description="Start date of holiday/leave")
    end_date: date = Field(description="End date of holiday/leave (inclusive)")
    title: str = Field(min_length=2, max_length=200, description="Holiday reason or festival name")
    notes: str | None = Field(default=None, max_length=1000)
    is_closed: bool = Field(default=True, description="True = lab is fully closed")


class LabHolidayResponse(BaseModel):
    id: UUID
    lab_id: UUID
    start_date: date
    end_date: date
    title: str
    notes: str | None
    is_closed: bool
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)
