from fastapi import APIRouter, HTTPException, Depends
from fastapi.responses import Response
from dbmodel import Instance, Series, Study
from utils import getImage
from ..dependencies import get_db

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

@router.get("/{InstanceUID}", response_class=Response, responses={
    200: {
        "content": {"application/dicom": {}},
        "description": "DICOM image data"
    },
    404: {
        "description": "Image not found"
    }
}, summary="Получить DICOM изображение", response_description="DICOM изображение в бинарном формате")
async def get_image(InstanceUID: str, db: None = Depends(get_db)):
    """
    Получить DICOM изображение по уникальному идентификатору инстанса.

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

    Instance (инстанс) - это отдельное DICOM изображение или объект в серии.
    Каждый инстанс:

    - Имеет уникальный SOP Instance UID
    - Принадлежит одной Series (серии)
    - Содержит одно изображение или объект данных
    - Имеет полный набор DICOM заголовков и пиксельных данных

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

    ## Параметры:
    - **InstanceUID**: Уникальный идентификатор инстанса (SOP Instance UID)

    Возвращает бинарные данные DICOM файла в формате application/dicom.
    """
    try:
        # Получить информацию об инстансе с связанными данными
        instance = Instance.select(Instance, Study.nodeCode).join(Series).join(Study).where(Instance.uid == InstanceUID).get()

        # Получить изображение в бинарном формате
        img = getImage(InstanceUID, instance.study_date.strftime("%Y%m"), instance.series.study.nodeCode, buffer=True)

        # Вернуть изображение как DICOM response
        return Response(
            img.getvalue(),
            headers={
                        "Cache-Control": "no-cache, no-store, must-revalidate",
                        "Pragma": "no-cache",
                        "Expires": "0"
                    },
            media_type='application/dicom'
        )

    except Instance.DoesNotExist:
        raise HTTPException(status_code=404, detail="Image not found")
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error retrieving image: {str(e)}")
