from fastapi import APIRouter, HTTPException, Depends
from typing import List, Optional
from pydantic import BaseModel, Field
from config import Config, ModalityConfig, config
from dbmodel import Study, SendLog
from peewee import fn
from ..dependencies import get_db




class ModalityResponse(ModalityConfig):
    """Response model for modalities with additional last study date information."""
    lastStudyDate: Optional[str] = Field(
        default=None,
        description="Date and time of the last study from this modality"
    )

router = APIRouter(prefix="/api/modalities", tags=["modalities"])

@router.get("", response_model=List[ModalityResponse])
async def get_modalities(db: None = Depends(get_db)) -> List[ModalityResponse]:
    """Метод возвращает список настроенных модальностей"""
    modalities_response = []
    for modality in config.modalities:
        datetime_str = None
        lastStudy = None
        if modality.name == "CAMI":
            last_sent_date = SendLog.select(fn.MAX(SendLog.sent)).scalar()
            if last_sent_date:
                datetime_str = last_sent_date.strftime('%Y-%m-%dT%H:%M:%S')
        elif modality.isSource:
            lastStudy = Study.select().where(Study.creator_aetitle == modality.aetitle).order_by(Study.date.desc()).first()
            if lastStudy:
                if lastStudy.time:
                    time_str = lastStudy.time[:6]
                    hours = time_str[:2]
                    minutes = time_str[2:4]
                    seconds = time_str[4:6]
                    datetime_str = f"{lastStudy.date.strftime('%Y-%m-%d')}T{hours}:{minutes}:{seconds}"
                else:
                    datetime_str = lastStudy.date.strftime('%Y-%m-%d')

        # Create ModalityResponse instance with all ModalityConfig fields plus lastStudyDate
        modality_response = ModalityResponse(
            **modality.dict(),
            lastStudyDate=datetime_str
        )
        modalities_response.append(modality_response)

    return modalities_response

@router.put("", response_model=ModalityResponse)
async def put_modality(modality_data: ModalityConfig) -> ModalityResponse:
    """Полное обновление или создание модальности"""
    # Ищем существующую модальность по aetitle
    existing_modality = next((m for m in config.modalities if m.aetitle == modality_data.aetitle), None)
    if existing_modality:
        # Обновление существующей модальности - полностью заменяем
        index = config.modalities.index(existing_modality)
        config.modalities[index] = modality_data
    else:
        # Создание новой модальности
        config.modalities.append(modality_data)

    # Сохранить конфиг
    config.save_and_notify()

    # Вернуть ответ с дополнительным полем lastStudyDate
    return ModalityResponse(
        **modality_data.dict(),
        lastStudyDate=None
    )


@router.patch("", response_model=ModalityResponse)
async def patch_modality(modality_update: ModalityConfig) -> ModalityResponse:
    """Частичное обновление модальности"""
    # Ищем существующую модальность по aetitle
    existing_modality = next((m for m in config.modalities if m.aetitle == modality_update.aetitle), None)
    if not existing_modality:
        raise HTTPException(
            status_code=404,
            detail=f"Модальность с AETitle '{modality_update.aetitle}' не найдена"
        )

    # Обновляем только переданные поля
    update_data = modality_update.dict(exclude_unset=True)
    for field, value in update_data.items():
        setattr(existing_modality, field, value)

    # Сохранить конфиг
    config.save_and_notify()

    # Вернуть обновленную модальность
    return ModalityResponse(
        **existing_modality.dict(),
        lastStudyDate=None
    )


@router.delete("/{aetitle}")
async def delete_modality(aetitle: str):
    """Удалить модальность по AETitle"""
    # Ищем существующую модальность по aetitle
    existing_modality = next((m for m in config.modalities if m.aetitle == aetitle), None)
    if not existing_modality:
        raise HTTPException(
            status_code=404,
            detail=f"Модальность с AETitle '{aetitle}' не найдена"
        )

    # Удаляем модальность из конфига
    config.modalities.remove(existing_modality)

    # Сохранить конфиг
    config.save_and_notify()

    return {"message": f"Модальность с AETitle '{aetitle}' успешно удалена"}
