# ============================================================
#  FastAPI 最小可运行示例（零额外配置！）
#  启动: uvicorn main:app --reload
#  访问: http://localhost:8000/docs (Swagger UI)
#         http://localhost:8000/redoc (Redoc)
#         http://localhost:8000/openapi.json
# ============================================================

from typing import List, Optional
from fastapi import FastAPI, HTTPException, Path, Query, Depends
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel, EmailStr, Field

app = FastAPI(
    title="FastAPI 用户 API",
    version="1.0.0",
    description="FastAPI 内置 Swagger UI 示例 —— 几乎零额外注解",
    contact={"name": "张三", "email": "dev@example.com"},
    servers=[
        {"url": "http://localhost:8000", "description": "本地"},
        {"url": "https://api.example.com", "description": "生产"},
    ],
)

bearer = HTTPBearer(auto_error=False)


class UserBase(BaseModel):
    name: str = Field(..., max_length=50, examples=["Alice"])
    email: EmailStr = Field(..., examples=["alice@x.com"])


class User(UserBase):
    id: int = Field(..., examples=[1])


class UserCreate(UserBase):
    pass


store: dict[int, User] = {}
next_id = 1


@app.get("/users", response_model=List[User], tags=["user"], summary="用户列表")
def list_users(
    page: int = Query(1, ge=1, description="页码（从 1 开始）"),
    size: int = Query(20, ge=1, le=100, description="每页大小"),
):
    items = list(store.values())
    return items[(page - 1) * size : page * size]


@app.get(
    "/users/{user_id}",
    response_model=User,
    tags=["user"],
    summary="查单条",
    responses={404: {"description": "用户不存在"}},
)
def get_user(user_id: int = Path(..., description="用户 ID", ge=1)):
    u = store.get(user_id)
    if not u:
        raise HTTPException(404, "用户不存在")
    return u


@app.post(
    "/users",
    response_model=User,
    status_code=201,
    tags=["user"],
    summary="创建用户",
    dependencies=[Depends(bearer)],
)
def create_user(body: UserCreate):
    global next_id
    u = User(id=next_id, **body.dict())
    store[next_id] = u
    next_id += 1
    return u


@app.delete(
    "/users/{user_id}",
    status_code=204,
    tags=["user"],
    summary="删除用户",
    dependencies=[Depends(bearer)],
)
def delete_user(user_id: int):
    store.pop(user_id, None)
