"""
api_health.py - API 헬스체크 verifier
subprocess로 curl을 실행하여 HTTP 상태코드 확인
"""
import subprocess
import shlex


CURL_TIMEOUT = 5


def _check_endpoint(base_url: str, endpoint: str) -> tuple[bool, str]:
    """단일 엔드포인트를 curl로 체크. (ok, detail_message) 반환."""
    url = base_url.rstrip("/") + "/" + endpoint.lstrip("/")
    cmd = [
        "curl",
        "-s",
        "-o", "/dev/null",
        "-w", "%{http_code}",
        "--max-time", str(CURL_TIMEOUT),
        "--connect-timeout", str(CURL_TIMEOUT),
        url,
    ]
    try:
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=CURL_TIMEOUT + 2,
        )
        status_code = result.stdout.strip()

        if not status_code:
            return False, f"GET {endpoint} → no response (connection refused or timeout)"

        try:
            code = int(status_code)
        except ValueError:
            return False, f"GET {endpoint} → invalid response: {status_code!r}"

        if code == 200:
            return True, f"GET {endpoint} → {code}"
        else:
            return False, f"GET {endpoint} → {code} (expected 200)"

    except subprocess.TimeoutExpired:
        return False, f"GET {endpoint} → timeout after {CURL_TIMEOUT}s"
    except FileNotFoundError:
        return False, "curl not found on this system"
    except Exception as e:
        return False, f"GET {endpoint} → unexpected error: {e}"


def verify(base_url: str, endpoints: list) -> dict:
    """
    API 헬스체크를 수행합니다.

    Args:
        base_url: API 베이스 URL (예: http://localhost:8000)
        endpoints: 체크할 엔드포인트 목록 (예: ['/api/status', '/api/stats'])

    Returns:
        {"status": "PASS"|"FAIL"|"SKIP", "details": [...]}
    """
    if not base_url:
        return {"status": "SKIP", "details": ["No base URL specified"]}

    if not endpoints:
        return {"status": "SKIP", "details": ["No endpoints specified"]}

    details = []
    all_pass = True

    for endpoint in endpoints:
        ok, detail = _check_endpoint(base_url, endpoint)
        details.append(detail)
        if not ok:
            all_pass = False

    status = "PASS" if all_pass else "FAIL"
    return {"status": status, "details": details}


if __name__ == "__main__":
    import sys
    import json

    base = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:8000"
    eps = sys.argv[2].split(",") if len(sys.argv) > 2 else ["/api/status"]

    result = verify(base, eps)
    print(json.dumps(result, ensure_ascii=False, indent=2))
