""" Schemas Pydantic para Dispositivo GPS/Tracker. """ from datetime import datetime from typing import Optional from pydantic import Field from app.schemas.base import BaseSchema, TimestampSchema class DispositivoBase(BaseSchema): """Schema base de dispositivo.""" tipo: str = Field(default="gps", max_length=50) identificador: str = Field(..., min_length=1, max_length=100) nombre: Optional[str] = Field(None, max_length=100) marca: Optional[str] = Field(None, max_length=50) modelo: Optional[str] = Field(None, max_length=50) numero_serie: Optional[str] = Field(None, max_length=100) telefono_sim: Optional[str] = Field(None, max_length=20) operador_sim: Optional[str] = Field(None, max_length=50) iccid: Optional[str] = Field(None, max_length=25) imei: Optional[str] = Field(None, max_length=20) protocolo: str = Field(default="osmand", max_length=50) intervalo_reporte: int = Field(default=30, ge=1, le=3600) class DispositivoCreate(DispositivoBase): """Schema para crear dispositivo.""" vehiculo_id: int class DispositivoUpdate(BaseSchema): """Schema para actualizar dispositivo.""" tipo: Optional[str] = Field(None, max_length=50) nombre: Optional[str] = Field(None, max_length=100) marca: Optional[str] = Field(None, max_length=50) modelo: Optional[str] = Field(None, max_length=50) numero_serie: Optional[str] = Field(None, max_length=100) telefono_sim: Optional[str] = Field(None, max_length=20) operador_sim: Optional[str] = Field(None, max_length=50) iccid: Optional[str] = Field(None, max_length=25) imei: Optional[str] = Field(None, max_length=20) protocolo: Optional[str] = Field(None, max_length=50) intervalo_reporte: Optional[int] = Field(None, ge=1, le=3600) configuracion: Optional[str] = None firmware_version: Optional[str] = Field(None, max_length=50) activo: Optional[bool] = None notas: Optional[str] = None class DispositivoResponse(DispositivoBase, TimestampSchema): """Schema de respuesta de dispositivo.""" id: int vehiculo_id: int ultimo_contacto: Optional[datetime] = None bateria: Optional[float] = None señal_gsm: Optional[int] = None satelites: Optional[int] = None configuracion: Optional[str] = None firmware_version: Optional[str] = None activo: bool conectado: bool notas: Optional[str] = None # Calculado esta_online: bool class DispositivoResumen(BaseSchema): """Schema resumido de dispositivo.""" id: int identificador: str tipo: str protocolo: str activo: bool conectado: bool ultimo_contacto: Optional[datetime] = None bateria: Optional[float] = None class DispositivoConVehiculo(DispositivoResponse): """Schema de dispositivo con información del vehículo.""" vehiculo_nombre: Optional[str] = None vehiculo_placa: Optional[str] = None