"""fastapi-gsap: Lightweight GSAP broker — GCAP-SPEC-SHELLBOUND-BROKER-0001.

Also hosts the delegation lifecycle module
(GCAP-SPEC-LLM-PRINCIPAL-BROKER-0001) absorbed from the standalone
llm-principal-broker service. The delegation router is mounted at
``/delegations`` and the storage layer reuses GSAP's existing async DB
engine — no separate process, no HTTP self-call.
"""
import asyncio
import structlog
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from gsap_broker.settings import settings
from gsap_broker.db import init_db
from gsap_broker.routers import authorize, complete, session, elevate, health, drivers, connectors, functions
from gsap_broker import mcp
from gsap_broker.delegations.router import router as delegations_router, manager as delegation_manager
from gsap_broker.delegations.cleanup import cleanup_loop as delegation_cleanup_loop
# Import storage so SQLModel.metadata picks up the delegations table at init_db().
from gsap_broker.delegations import storage as _delegations_storage  # noqa: F401

logger = structlog.get_logger()

@asynccontextmanager
async def lifespan(app: FastAPI):
    await init_db()
    cleanup_task = asyncio.create_task(delegation_cleanup_loop(delegation_manager))
    logger.info(
        "fastapi-gsap started",
        broker_did=settings.broker_did,
        delegations_router="/delegations",
    )
    try:
        yield
    finally:
        cleanup_task.cancel()
        try:
            await cleanup_task
        except asyncio.CancelledError:
            pass

app = FastAPI(title="fastapi-gsap", description="GSAP broker PoC — GCAP-SPEC-SHELLBOUND-BROKER-0001",
              version="0.1.0", lifespan=lifespan)
app.add_middleware(CORSMiddleware, allow_origins=settings.cors_origins, allow_credentials=True,
                   allow_methods=["*"], allow_headers=["*"])
app.include_router(authorize.router, prefix="/governance", tags=["AC"])
app.include_router(complete.router, prefix="/governance", tags=["CR"])
app.include_router(session.router, prefix="/governance", tags=["Session"])
app.include_router(elevate.router, prefix="/governance", tags=["Elevation"])
app.include_router(drivers.router, prefix="/governance", tags=["Drivers"])
app.include_router(connectors.router, prefix="/connectors", tags=["Connectors"])
app.include_router(functions.router, prefix="/functions", tags=["Functions"])
app.include_router(health.router, tags=["Health"])
app.include_router(mcp.router, tags=["MCP"])
app.include_router(delegations_router)
