"""FastAPI 진입점: 정적 자산 마운트, 라우터 등록, 헬스체크.

화면용 라우트는 JSON 이 아니라 HTML(전체 페이지 또는 조각)을 반환한다(스펙 §7).
"""

from __future__ import annotations

from pathlib import Path

import httpx
from fastapi import Depends, FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles

# 테스트 호환을 위해 re-export (tests 가 app.main.get_pulp_client 를 override 함)
from .deps import get_pulp_client, templates
from .pulp_client import PulpClient
from .routes import dashboard

BASE_DIR = Path(__file__).resolve().parent

app = FastAPI(title="Pulp 패치 관리 콘솔")
app.mount("/static", StaticFiles(directory=str(BASE_DIR / "static")), name="static")
app.include_router(dashboard.router)

__all__ = ["app", "get_pulp_client"]


@app.get("/healthz", response_class=HTMLResponse)
def healthz(
    request: Request, pulp: PulpClient = Depends(get_pulp_client)
) -> HTMLResponse:
    """Pulp status 프록시 → 연결 상태 배지 조각."""
    try:
        pulp.status()
        online, detail = True, "Pulp 연결됨"
    except httpx.HTTPError as exc:
        online, detail = False, f"Pulp 연결 실패: {exc}"

    return templates.TemplateResponse(
        request,
        "partials/health.html",
        {"online": online, "detail": detail},
        status_code=200 if online else 503,
    )
