from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
import uvicorn
import logging
import os
import signal
from .routes import studies, series, worklist, analytics, images, modalities, auth, logs, temp_capture, users
import config

app = FastAPI(
    title="SAMSON IDS API",
    version="0.1",
    description="""
    API для веб-интерфейса системы управления медицинскими исследованиями и изображениями.

    ## Основные возможности:

    - **Работа с исследованиями** - получение списка исследований, детальной информации, поиск и фильтрация
    - **Просмотр изображений** - доступ к сериям снимков и превью изображений
    - **Управление ворклистом** - работа с расписанием исследований и процедур
    - **Аналитика** - статистика по исследованиям, изображениям и передачам данных
    - **Настройка системы** - управление подключенным оборудованием и модальностями

    API предоставляет RESTful интерфейс для интеграции с веб-приложениями и сторонними системами.
    """
)

# Настройка логирования
logger = logging.getLogger("sampacs")

# Инициализация Redis логирования для API
try:
    from redis_logger import setup_redis_logging
    redis_handler = setup_redis_logging(
        logger_name='sampacs',
        max_history=10000,
        ttl_days=7,
        enable_console_fallback=True
    )

    if redis_handler and redis_handler._redis_available:
        logger.info("Redis logging initialized for API")
    else:
        logger.info("Redis logging not available for API, using console")
except ImportError:
    logger.warning("Redis logger module not available")
except Exception as e:
    logger.error(f"Failed to initialize Redis logging: {e}")

# Signal handler for config reload
def setup_signal_handler():
    """Setup SIGUSR1 handler to reload config in uvicorn"""
    def sigusr1_handler(signum, frame):
        try:
            config.config = config.Config.from_file()
            logger.info(f"Config reloaded successfully (pid={os.getpid()})")

        except Exception as e:
            logger.error(f"Failed to reload config: {e}")

    signal.signal(signal.SIGUSR1, sigusr1_handler)
    logger.info(f"SIGUSR1 handler registered in uvicorn (pid={os.getpid()})")

# Setup signal handler
setup_signal_handler()

# Middleware для логирования всех запросов и ошибок
@app.middleware("http")
async def log_requests(request: Request, call_next):
    try:
        response = await call_next(request)
        return response
    except Exception as e:
        logger.error(f"Error in {request.method} {request.url}: {str(e)}", exc_info=True)
        return JSONResponse(
            status_code=500,
            content={"detail": "Internal server error"}
        )

# Обработчик ошибок валидации запросов
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    errors_for_log = []
    for error in exc.errors():
        error_copy = error.copy()
        if 'input' in error_copy and isinstance(error_copy['input'], bytes):
            error_copy['input'] = error_copy['input'].decode('utf-8', errors='replace')
        errors_for_log.append(error_copy)

    logger.error(f"Request validation error in {request.method} {request.url}: {errors_for_log}")

    # Преобразуем ошибки для ответа
    errors_for_response = []
    for error in exc.errors():
        error_copy = error.copy()
        if 'input' in error_copy and isinstance(error_copy['input'], bytes):
            error_copy['input'] = error_copy['input'].decode('utf-8', errors='replace')
        errors_for_response.append(error_copy)

    return JSONResponse(
        status_code=422,
        content={"detail": errors_for_response}
    )


@app.get("/api/version")
async def get_version():
    """Версия апи"""
    return "2"



# Include routers
app.include_router(analytics.router)
app.include_router(worklist.router)
app.include_router(studies.router)
app.include_router(series.router)
app.include_router(images.router)
#app.include_router(video.routes.router)
app.include_router(modalities.router)
app.include_router(auth.router)
app.include_router(logs.router)
#app.include_router(descriptions.router)
app.include_router(temp_capture.router)
app.include_router(users.router)

if __name__ == "__main__":
    uvicorn.run(app, host="192.168.75.31", port=6121)
