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)