import os
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
from fastapi.staticfiles import StaticFiles
from app.config import settings
from app.database import Base, engine
from app.routers import auth, articles
from app.security_headers import SecurityHeadersMiddleware


@asynccontextmanager
async def lifespan(app:FastAPI) -> AsyncIterator[None]:
    Base.metadata.create_all(bind=engine)
    yield

app = FastAPI(title=settings.PROJECT_NAME, lifespan=lifespan)

app.add_middleware(SecurityHeadersMiddleware)           # Your API serves article HTML content, so CSP and clickjacking protection matter.
app.add_middleware(GZipMiddleware, minimum_size=1000)   # Valuable for a news API because article responses contain large HTML bodies. Compressing them reduces bandwidth and improves response times noticeably
app.add_middleware(
    CORSMiddleware,
    allow_origins = settings.allowed_origins_list,
    allow_credentials = True,
    allow_methods = ["*"],
    allow_headers = ["*"],
)

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

app.include_router(auth.router, prefix="/api")
app.include_router(articles.router, prefix="/api")

# images folder
images_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "content", "images")
if os.path.isdir(images_dir):
    app.mount("/api/images", StaticFiles(directory=images_dir), name="images")
