from typing import Optional from pydantic import BaseModel, Field, field_validator class ClassroomBaseDTO(BaseModel): code: str = Field(..., min_length=1, max_length=50, description="Código o nombre del aula (ej: Aula 101, VIRTUAL-A)") floor: str = Field(default="PB", max_length=50, description="Piso o nivel (PB, Piso 1, etc.)") capacity: int = Field(default=30, ge=1, le=10000, description="Capacidad máxima de estudiantes") description: Optional[str] = Field(default=None, max_length=500, description="Detalles o equipamiento") is_active: bool = Field(default=True, description="Estado operativo del aula") @field_validator('code') @classmethod def clean_code(cls, v: str) -> str: v = v.strip() if not v: raise ValueError("El código del aula no puede estar vacío.") return v @field_validator('floor') @classmethod def clean_floor(cls, v: str) -> str: return str(v).strip() or "PB" class ClassroomCreateDTO(ClassroomBaseDTO): building_id: Optional[int] = Field(default=None, description="ID del edificio asignado") building_name: Optional[str] = Field(default=None, description="Nombre de edificio (para creación dinámica)") class ClassroomUpdateDTO(BaseModel): building_id: Optional[int] = None code: Optional[str] = None floor: Optional[str] = None capacity: Optional[int] = None description: Optional[str] = None is_active: Optional[bool] = None class ClassroomResponseDTO(ClassroomBaseDTO): id: int building_id: Optional[int] = None building_name: str is_virtual: bool location_display: str class Config: from_attributes = True