"""AegisTrade AI — Production FastAPI Server Entrypoint."""
from __future__ import annotations

import os
from pathlib import Path

from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from fastapi.staticfiles import StaticFiles

from backend.app.api.router import api_v1_router
from backend.app.audit.logger import audit_logger, redact_sensitive_data
from backend.app.config.settings import settings

from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    audit_logger.info("Initializing AegisTrade AI Platform...")
    settings.validate_safety_invariants()
    audit_logger.info(
        "Boot successful. Operational Mode: %s | Live Trading Enabled: %s",
        settings.TRADING_MODE.value,
        settings.ENABLE_LIVE_TRADING,
    )
    yield

app = FastAPI(
    title="AegisTrade AI — Intelligent Trading & Capital Protection System",
    description="Production-Grade Autonomous Cryptocurrency Trading Platform with Independent Risk Engine and Bybit V5 Integration.",
    version="1.0.0",
    docs_url="/docs",
    redoc_url="/redoc",
    lifespan=lifespan,
)

# CORS Configuration
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Restricted in production via settings
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception) -> JSONResponse:
    err_str = redact_sensitive_data(str(exc))
    audit_logger.error("Unhandled API Exception at %s: %s", request.url.path, err_str)
    return JSONResponse(
        status_code=500,
        content={"detail": "Internal server error. Safe state preserved.", "error": err_str},
    )


# Include API v1 Router
app.include_router(api_v1_router)

# Mount frontend static distribution directory if present
frontend_dist = Path(__file__).resolve().parent.parent.parent / "frontend" / "dist"
if frontend_dist.exists() and (frontend_dist / "index.html").exists():
    app.mount("/", StaticFiles(directory=str(frontend_dist), html=True), name="static")
else:
    @app.get("/")
    async def root() -> dict[str, str]:
        return {
            "name": "AegisTrade AI",
            "version": "1.0.0",
            "status": "Operational",
            "mode": settings.TRADING_MODE.value,
            "api_docs": "/docs",
        }


if __name__ == "__main__":
    import uvicorn
    uvicorn.run("backend.app.main:app", host="0.0.0.0", port=8000, reload=True)
