from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles

from app.config import settings
from app.db import db_ping, init_db
from app.routers.auth import router as auth_router
from app.routers.bank import router as bank_router
from app.routers.documents import router as documents_router
from app.routers.ledger import router as ledger_router
from app.routers.notifications import router as notifications_router
from app.routers.jobs import router as jobs_router
from app.routers.queries import router as queries_router
from app.routers.search import router as search_router
from app.routers.snelstart import router as snelstart_router
from app.services.avatars import UPLOAD_ROOT, ensure_dirs as ensure_avatar_dirs
from app.services.documents import ensure_dirs as ensure_document_dirs

app = FastAPI(title=settings.app_name)

app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.cors_origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.on_event("startup")
def on_startup() -> None:
    init_db()
    ensure_avatar_dirs()
    ensure_document_dirs()
    # Resume local OCR for documents left in Processing after a restart.
    try:
        from app.services import document_processing as processing

        processing.enqueue_pending_documents(limit=15)
    except Exception:
        pass


@app.get("/api/health")
def health() -> dict[str, str | bool]:
    return {
        "status": "ok",
        "service": settings.app_name,
        "database": db_ping(),
    }


app.include_router(auth_router, prefix=settings.api_prefix)
app.include_router(bank_router, prefix=settings.api_prefix)
app.include_router(documents_router, prefix=settings.api_prefix)
app.include_router(ledger_router, prefix=settings.api_prefix)
app.include_router(notifications_router, prefix=settings.api_prefix)
app.include_router(queries_router, prefix=settings.api_prefix)
app.include_router(jobs_router, prefix=settings.api_prefix)
app.include_router(snelstart_router, prefix=settings.api_prefix)
app.include_router(search_router, prefix=settings.api_prefix)

# Served profile images: /api/uploads/avatars/...
ensure_avatar_dirs()
ensure_document_dirs()
app.mount(
    f"{settings.api_prefix}/uploads",
    StaticFiles(directory=str(UPLOAD_ROOT)),
    name="uploads",
)

