from fastapi import FastAPI, Depends, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from contextlib import asynccontextmanager
import logging
import os

from routers import translate, transcribe, detect_language, caption
from middleware.api_key_auth import verify_api_key
from services.whisper_service import WhisperService
from services.translator import TranslatorService

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("eclyss-ai")


@asynccontextmanager
async def lifespan(app: FastAPI):
    """Preîncarcă modelele la startup."""
    logger.info("Loading AI models...")
    WhisperService()        # Singleton init — descarcă Whisper
    TranslatorService()     # Singleton init — pregătește pipeline-ul
    logger.info("AI models loaded. Service ready.")
    yield
    logger.info("AI Service shutting down.")


app = FastAPI(
    title="Eclyss AI Service",
    version="1.0.0",
    description="Internal AI microservice: translate, transcribe, detect language, caption.",
    docs_url=None if os.getenv("APP_ENV") == "production" else "/docs",
    redoc_url=None,
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://php", "http://localhost", "http://127.0.0.1"],
    allow_methods=["POST", "GET"],
    allow_headers=["X-AI-Key", "Content-Type"],
)

# Toate rutele sunt protejate de API key
app.include_router(
    translate.router,
    dependencies=[Depends(verify_api_key)],
)
app.include_router(
    transcribe.router,
    dependencies=[Depends(verify_api_key)],
)
app.include_router(
    detect_language.router,
    dependencies=[Depends(verify_api_key)],
)
app.include_router(
    caption.router,
    dependencies=[Depends(verify_api_key)],
)


@app.get("/health")
async def health():
    return {"status": "ok", "service": "eclyss-ai", "version": "1.0.0"}


@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    logger.error(f"Unhandled error: {exc}", exc_info=True)
    return JSONResponse(
        status_code=500,
        content={"error": "Internal server error", "detail": str(exc)},
    )
