"""Python sidecar HTTP server for ShowRunner desktop app."""

import logging
import os
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager

import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from python_sidecar.api import analysis, events, export, terminal, transcription, upload

logging.basicConfig(
    level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)


@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
    """Application lifespan manager."""
    logger.info("Starting ShowRunner Python sidecar...")
    yield
    logger.info("Shutting down Python sidecar...")


app = FastAPI(
    title="ShowRunner Sidecar",
    description="Event processing, overlay mapping, and FFmpeg export",
    version="0.1.0",
    lifespan=lifespan,
)

# Allow Tauri frontend to connect
app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:1420", "tauri://localhost"],
    allow_origin_regex=r"^chrome-extension://.*$",
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Register API routers
app.include_router(events.router, prefix="/api/events", tags=["events"])
app.include_router(export.router, prefix="/api/export", tags=["export"])
app.include_router(terminal.router, prefix="/api/terminal", tags=["terminal"])
app.include_router(upload.router, prefix="/api/upload", tags=["upload"])
app.include_router(analysis.router, prefix="/api/analysis", tags=["analysis"])
app.include_router(transcription.router, prefix="/api/transcription", tags=["transcription"])


@app.get("/health")
async def health_check() -> dict[str, str]:
    """Health check endpoint."""
    return {"status": "ok"}


def main() -> None:
    """Run the sidecar server."""
    reload_enabled = os.environ.get("SHOWRUNNER_SIDECAR_RELOAD", "").strip().lower() in {
        "1",
        "true",
        "yes",
    }
    uvicorn.run(
        "python_sidecar.main:app",
        host="127.0.0.1",
        port=8765,
        reload=reload_enabled,
    )


if __name__ == "__main__":
    main()
