from fastapi import APIRouter, HTTPException, Depends
from fastapi.responses import Response
from pydantic import BaseModel, Field
from typing import List
import hashlib
from dbmodel import Series, Study, Instance
from utils import getPreview
from config import config
from ..dependencies import get_db

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


class SeriesInstancesResponse(BaseModel):
    """Response model for series instances list"""
    id: str = Field(description="Series Instance UID")
    description: str = Field(description="Series description")
    modality: str = Field(description="Series modality (CT, MR, US, etc.)")
    instances: List[str] = Field(description="List of download links for instances in this series")

@router.get("/{SeriesID}", response_model=SeriesInstancesResponse, summary="Получить список инстансов серии", response_description="Список инстансов серии")
async def get_series_instances(SeriesID: str, db: None = Depends(get_db)):
    """
    Получить список инстансов (изображений) для указанной серии.

    ## Что возвращает метод:
    - **id**: Уникальный идентификатор серии (Series Instance UID)
    - **description**: Описание серии
    - **modality**: Тип модальности серии (CT, MR, US и т.д.)
    - **instances**: Массив ссылок для скачивания DICOM файлов

    ## Иерархия DICOM:
    Patient → Study → **Series** → Instance

    ## Параметры:
    - **SeriesID**: Уникальный идентификатор серии (Series Instance UID)
    """
    try:
        # Получить информацию о серии
        series = Series.select(Series, Study.nodeCode, Study.date).join(Study).where(Series.uid == SeriesID).first()
        if not series:
            raise HTTPException(status_code=404, detail="Series not found")

        # Получить список инстансов серии с ссылками для скачивания
        instances_query = Instance.select(Instance.uid).where(Instance.series_id == SeriesID).order_by(Instance.number.asc())
        instance_links = []

        for instance in instances_query:
            if config.nodeCode == series.study.nodeCode:
                # Генерируем ссылку с хешем
                uidhash = hashlib.md5(instance.uid.encode('utf8')).hexdigest()[:2]
                study_date = series.study.date.strftime("%Y%m")
                link = f"/images/{study_date}/{uidhash}/{instance.uid}.dcm"
            else:
                # Используем API ссылку
                link = f"/api/images/{instance.uid}"
            instance_links.append(link)

        return SeriesInstancesResponse(
            id=SeriesID,
            description=series.description or "",
            modality=series.modality,
            instances=instance_links
        )

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error retrieving series instances: {str(e)}")


@router.get("/{SeriesID}/preview", response_class=Response, responses={
    200: {
        "content": {"image/jpeg": {}},
        "description": "Preview image in JPEG format"
    },
    404: {
        "description": "Series not found or preview not available"
    }
}, summary="Получить превью изображение серии", response_description="Превью изображение в формате JPEG")
async def series_preview(SeriesID: str, db: None = Depends(get_db)):
    """
    Получить превью изображение для DICOM серии.

    ## Что такое Series в DICOM?

    Series (серия) - это набор связанных DICOM изображений, полученных в рамках одного исследования.
    Каждая серия представляет собой логическую группу снимков:

    - Имеет уникальный Series Instance UID
    - Принадлежит одному Study (исследованию)
    - Содержит один или несколько Instances (инстансов/снимков)
    - Имеет общие характеристики: модальность, описание, номер серии

    ## Характеристики серии:
    - **Modality**: Тип оборудования (CT, MR, US, XA, etc.)
    - **Series Number**: Порядковый номер серии в исследовании
    - **Series Description**: Описание содержания серии
    - **Number of Images**: Количество снимков в серии

    ## Превью изображение:
    - Представляет собой уменьшенную версию одного из снимков серии
    - Используется для быстрого просмотра содержимого серии
    - Формат: JPEG
    - Размер: оптимизирован для веб-отображения

    ## Иерархия DICOM:
    Patient → Study → **Series** → Instance
    """

    # Query series with study information
    series_query = Series.select(Series, Study).join(Study).where(Series.uid == SeriesID)
    series_count = len(series_query)

    if series_count == 0:
        raise HTTPException(status_code=404, detail="Series not found")

    series = series_query[0]

    # Get preview image
    img = getPreview(
        SeriesID,
        series.study.date.strftime("%Y%m"),
        series.study.nodeCode
    )

    if img is None:
        raise HTTPException(status_code=404, detail="Preview not available")

    # Return image as JPEG response
    return Response(
        content=img.getvalue(),
        media_type="image/jpeg"
    )
