from datetime import date, datetime from typing import List, Dict, Optional, Any from uuid import UUID from pydantic import BaseModel, Field class MobileCalendarEntryResponse(BaseModel): """Формат ответа для мобильного приложения""" id: int uuid: str date: str # ISO формат даты YYYY-MM-DD type: str # Тип записи в формате мобильного приложения (MENSTRUATION, OVULATION, etc.) flow_intensity: Optional[int] = None # Шкала интенсивности 1-5 mood: Optional[str] = None symptoms: List[str] = Field(default_factory=list) notes: Optional[str] = None created_at: str # ISO формат даты и времени is_predicted: bool = False class MobileCalendarPeriodInfo(BaseModel): """Информация о текущем цикле для мобильного приложения""" current_cycle_start: Optional[str] = None # ISO формат даты YYYY-MM-DD expected_period_end: Optional[str] = None # ISO формат даты YYYY-MM-DD cycle_length: Optional[int] = None period_length: Optional[int] = None average_cycle_length: Optional[int] = None fertility_window_start: Optional[str] = None # ISO формат даты YYYY-MM-DD fertility_window_end: Optional[str] = None # ISO формат даты YYYY-MM-DD ovulation_date: Optional[str] = None # ISO формат даты YYYY-MM-DD class MobilePredictionInfo(BaseModel): """Информация о прогнозах для мобильного приложения""" next_period_date: Optional[str] = None # ISO формат даты YYYY-MM-DD confidence_level: Optional[int] = None # 0-100 уровень уверенности next_fertile_window_start: Optional[str] = None # ISO формат даты YYYY-MM-DD next_fertile_window_end: Optional[str] = None # ISO формат даты YYYY-MM-DD next_ovulation_date: Optional[str] = None # ISO формат даты YYYY-MM-DD class MobileCalendarResponse(BaseModel): """Полный ответ для мобильного приложения""" entries: List[MobileCalendarEntryResponse] period_info: MobileCalendarPeriodInfo = Field(default_factory=MobileCalendarPeriodInfo) prediction: MobilePredictionInfo = Field(default_factory=MobilePredictionInfo)