from fastapi import APIRouter, HTTPException, Response, Request
import os
import logging
from typing import Optional

from .generator import generate_series_video, cleanup_old_videos
from dbmodel import Study, Series

# Configure logger
LOGGER = logging.getLogger('sampacs.video_api')

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

@router.get("/series/{SeriesUID}/preview", summary="Сгенерировать видео превью для серии")
async def generate_series_video_preview(SeriesUID: str, request: Request) -> Response:
    """
    Сгенерировать видео превью для DICOM серии.

    ## Описание:
    - Генерирует WebM видео из всех снимков серии
    - Использует ffmpeg для создания анимации
    - Поддерживает CT и MR исследования
    - Видео кэшируется на 24 часа

    ## Процесс:
    1. Проверка существования исследования и серии
    2. Генерация JPEG кадров из DICOM файлов
    3. Создание WebM видео с частотой 10 кадров/сек
    4. Возврат готового видео файла

    ## Ограничения:
    - Требуется ffmpeg в системе
    - Минимум 2 снимка в серии
    - Время генерации зависит от количества снимков
    """

    # Проверить существование серии
    series = Series.get_or_none(Series.uid == SeriesUID)
    if not series:
        raise HTTPException(status_code=404, detail="Серия не найдена")

    # Проверить модальность (только CT и MR)
    if series.modality not in ['CT', 'MR']:
        raise HTTPException(status_code=400, detail="Видео превью поддерживается только для CT и MR исследований")

    LOGGER.info(f"Generating video preview for series {SeriesUID}")

    # Сгенерировать видео
    video_path = await generate_series_video(SeriesUID, series.study_id, request)

    if not video_path or not os.path.exists(video_path):
        raise HTTPException(status_code=500, detail="Не удалось сгенерировать видео превью")

    # Прочитать видео файл
    try:
        with open(video_path, 'rb') as video_file:
            video_content = video_file.read()

        # Вернуть видео как ответ
        return Response(
            content=video_content,
            media_type="video/webm",
            headers={
                "Content-Disposition": f'attachment; filename="{SeriesUID}.webm"',
                "Cache-Control": "public, max-age=86400"  # Кэш на 24 часа
            }
        )

    except Exception as e:
        LOGGER.error(f"Error reading video file {video_path}: {e}")
        raise HTTPException(status_code=500, detail="Ошибка при чтении сгенерированного видео")

@router.delete("/cache/cleanup", summary="Очистить кэш видео файлов")
async def cleanup_video_cache() -> dict:
    """
    Очистить старые файлы из кэша видео.

    ## Описание:
    - Удаляет видео файлы старше 24 часов
    - Освобождает дисковое пространство
    - Выполняется автоматически, но можно вызвать вручную

    ## Возвращает:
    - Сообщение о результате очистки
    """

    try:
        cleanup_old_videos(max_age_hours=24)
        return {
            "message": "Кэш видео файлов очищен",
            "details": "Удалены файлы старше 24 часов"
        }
    except Exception as e:
        LOGGER.error(f"Error cleaning up video cache: {e}")
        raise HTTPException(status_code=500, detail="Ошибка при очистке кэша")
