from datetime import date
from enum import Enum
from typing import Optional, Dict, Any, List, Union

from fastapi import Depends, FastAPI, HTTPException
from pydantic import BaseModel, Field, root_validator
from sqlalchemy.ext.asyncio import AsyncSession

from .schemas import (
    EntryType, FlowIntensity, MoodType, CalendarEntryCreate, CalendarEntryResponse
)
from .schemas_mobile import (
    MobileFlowIntensity, MobileMood, convert_mobile_app_format_to_server
)
from services.calendar_service.models import CalendarEntry
from shared.auth import get_current_user_from_token as get_current_user
from shared.database import get_db


class MobileCalendarEntryCreate(BaseModel):
    """Схема для создания записей в календаре из мобильного приложения"""
    date: date
    type: str  # Тип записи (MENSTRUATION, OVULATION и т.д.)
    flow_intensity: Optional[int] = None  # Шкала 1-5
    symptoms: Optional[List[str]] = None  # Массив строк с симптомами
    mood: Optional[str] = None  # Настроение как строка (NORMAL, HAPPY и т.д.)
    notes: Optional[str] = None


async def mobile_create_calendar_entry(
    mobile_entry: MobileCalendarEntryCreate,
    current_user: Dict = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
):
    """Создать новую запись в календаре из мобильного приложения"""
    
    # Преобразуем симптомы из списка в строку
    symptoms_str = ""
    if mobile_entry.symptoms:
        symptoms_str = ", ".join(mobile_entry.symptoms)
    
    # Преобразуем формат мобильного приложения в формат сервера
    server_entry = CalendarEntryCreate(
        entry_date=mobile_entry.date,
        entry_type=EntryType.PERIOD if mobile_entry.type == "MENSTRUATION" else 
                   EntryType.OVULATION if mobile_entry.type == "OVULATION" else 
                   EntryType.SYMPTOMS,
        flow_intensity=FlowIntensity.from_int(mobile_entry.flow_intensity) if mobile_entry.flow_intensity else None,
        mood=MoodType.from_mobile_mood(mobile_entry.mood) if mobile_entry.mood else None,
        symptoms=symptoms_str,
        notes=mobile_entry.notes,
        # Значения по умолчанию для обязательных полей сервера
        period_symptoms="",
        energy_level=1,  # Минимальное значение должно быть 1
        sleep_hours=0,
        medications="",
    )

    # Создаем новую запись в календаре
    new_entry = CalendarEntry(
        user_id=current_user["user_id"],
        entry_date=server_entry.entry_date,
        entry_type=server_entry.entry_type.value,
        flow_intensity=server_entry.flow_intensity.value if server_entry.flow_intensity else None,
        period_symptoms=server_entry.period_symptoms,
        mood=server_entry.mood.value if server_entry.mood else None,
        energy_level=server_entry.energy_level,
        sleep_hours=server_entry.sleep_hours,
        symptoms=server_entry.symptoms,
        medications=server_entry.medications,
        notes=server_entry.notes,
    )
    
    db.add(new_entry)
    await db.commit()
    await db.refresh(new_entry)
    
    # Если это запись о менструации, обновляем данные цикла
    if server_entry.entry_type == EntryType.PERIOD:
        from .main import update_cycle_data
        await update_cycle_data(current_user["user_id"], server_entry.entry_date, db)
    
    return CalendarEntryResponse.model_validate(new_entry)