"""
FastAPI 백엔드 API 서버

- /api/hello: Vue 프론트엔드에서 호출할 JSON API 엔드포인트
- / (static): 빌드된 Vue SPA 정적 파일 서빙

실행:
    uvicorn app:app --reload --port 8000
"""

from contextlib import asynccontextmanager

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

from database import engine
from models import Base
from routers.samples import router as samples_router


@asynccontextmanager
async def lifespan(app: FastAPI):
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    yield


app = FastAPI(title="Hello Web API", lifespan=lifespan)

# CORS 설정 - Vue 개발 서버(localhost:5173)의 요청을 허용
app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:5173", "http://127.0.0.1:5173"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


app.include_router(samples_router)


# JSON API 엔드포인트
@app.get("/api/hello")
async def hello_api():
    """
    Vue 프론트엔드가 호출할 API 엔드포인트.

    Returns:
        dict: 메시지와 초기 카운트 값을 JSON 형태로 반환
    """
    return {
        "message": "Hello from FastAPI!",
        "initialCount": 0,
    }


# Vue 빌드 결과물(정적 파일) 서빙
# frontend/dist 폴더를 정적 파일 디렉토리로 마운트
app.mount("/", StaticFiles(directory="../frontend/dist", html=True), name="frontend")
