"""Health + meta endpoints.

/healthz  — public (id-auth allowlist + container healthcheck).
/api/meta — app identity, version, changelog head, DB reachability;
            the SPA footer and version-skew banner read this.
"""

from fastapi import APIRouter
from pydantic import BaseModel
from sqlalchemy import text

from app.config import settings
from app.db import get_engine
from app.version import VERSION, changelog_head

router = APIRouter()


class DbStatus(BaseModel):
    connected: bool
    server_version: str | None = None


class Meta(BaseModel):
    app: str
    version: str
    changelog_head: str | None
    db: DbStatus


@router.get("/healthz", include_in_schema=False)
def healthz() -> dict[str, str]:
    return {"status": "ok"}


@router.get("/api/meta", response_model=Meta)
def meta() -> Meta:
    return Meta(
        app=settings.app_name,
        version=VERSION,
        changelog_head=changelog_head(),
        db=_db_status(),
    )


def _db_status() -> DbStatus:
    try:
        with get_engine().connect() as conn:
            version = conn.execute(text("SHOW server_version")).scalar_one()
    except Exception:
        return DbStatus(connected=False)
    return DbStatus(connected=True, server_version=str(version))
