from fastapi import APIRouter, Response, status

from app.core.config import database_dialect, is_production
from app.core.schema_meta import CURRENT_SCHEMA_VERSION, check_database
from app.version import __version__

router = APIRouter(tags=["health"])


def _health_payload(*, deep: bool) -> dict:
    payload: dict = {
        "status": "healthy",
        "version": __version__,
        "environment": "production" if is_production() else "development",
        "database_dialect": database_dialect(),
    }
    if deep:
        db = check_database()
        payload["database"] = db
        if not db.get("ok"):
            payload["status"] = "unhealthy"
        elif not db.get("schema_up_to_date"):
            payload["status"] = "degraded"
        payload["expected_schema_version"] = CURRENT_SCHEMA_VERSION
    return payload


@router.get("/api/health")
@router.get("/health")
async def health():
    return _health_payload(deep=True)


@router.get("/api/health/live")
@router.get("/health/live")
async def health_live():
    return {"status": "ok"}


@router.get("/api/health/ready")
@router.get("/health/ready")
async def health_ready(response: Response):
    body = _health_payload(deep=True)
    if body["status"] != "healthy":
        response.status_code = status.HTTP_503_SERVICE_UNAVAILABLE
    return body