"""
Main FastAPI application for the sim-search API.

This module defines the FastAPI application and includes all routes.
"""

import os
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.openapi.utils import get_openapi

from app.api.routes import query, search, report, auth
from app.core.config import settings

# Create FastAPI app
app = FastAPI(
    title=settings.PROJECT_NAME,
    description=settings.PROJECT_DESCRIPTION,
    version=settings.VERSION,
    docs_url=None,  # Disable default docs
    redoc_url=None,  # Disable default redoc
)

# Set up CORS middleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.CORS_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Include routers
app.include_router(auth.router, prefix=f"{settings.API_V1_STR}/auth", tags=["Authentication"])
app.include_router(query.router, prefix=f"{settings.API_V1_STR}/query", tags=["Query Processing"])
app.include_router(search.router, prefix=f"{settings.API_V1_STR}/search", tags=["Search Execution"])
app.include_router(report.router, prefix=f"{settings.API_V1_STR}/report", tags=["Report Generation"])

# Custom OpenAPI and documentation endpoints
@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():
    """Custom Swagger UI documentation."""
    return get_swagger_ui_html(
        openapi_url=f"{settings.API_V1_STR}/openapi.json",
        title=f"{settings.PROJECT_NAME} - Swagger UI",
        oauth2_redirect_url=f"{settings.API_V1_STR}/docs/oauth2-redirect",
        swagger_js_url="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js",
        swagger_css_url="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css",
    )

@app.get(f"{settings.API_V1_STR}/openapi.json", include_in_schema=False)
async def get_open_api_endpoint():
    """Return OpenAPI schema."""
    return get_openapi(
        title=settings.PROJECT_NAME,
        version=settings.VERSION,
        description=settings.PROJECT_DESCRIPTION,
        routes=app.routes,
    )

@app.get("/", tags=["Status"])
async def root():
    """Root endpoint to check API status."""
    return {
        "status": "online",
        "version": settings.VERSION,
        "project": settings.PROJECT_NAME,
        "docs": "/docs"
    }

# Initialize components on startup
@app.on_event("startup")
async def startup_event():
    """Initialize components on startup."""
    # Import here to avoid circular imports
    from app.services.report_service import initialize_report_generator
    
    # Initialize report generator
    await initialize_report_generator()
