"""
使用者相關 API。

  - GET   /api/users      ─ 列團隊全部成員(任務指派、KPI、assignee chip 都用)
  - GET   /api/users/me   ─ 取得自己的資料
  - PATCH /api/users/me   ─ 更新自己的顯示名稱 / 頭像
"""

from fastapi import APIRouter
from sqlalchemy import select

from app.core.deps import CurrentUser, DBSession
from app.models.user import User
from app.schemas.user import UserPublic, UserUpdateRequest


router = APIRouter(prefix="/api/users", tags=["users"])


@router.get("", response_model=list[UserPublic], summary="列團隊全部成員")
async def list_users(current_user: CurrentUser, db: DBSession) -> list[User]:
    """回傳全部活躍成員(供前端 assignee chip / KPI / 派工選單用)。"""
    rows = (await db.execute(
        select(User)
        .where(User.is_active.is_(True), User.deleted_at.is_(None))
        .order_by(User.created_at)
    )).scalars().all()
    return list(rows)


@router.get("/me", response_model=UserPublic, summary="取得當前登入者資料")
async def get_me(current_user: CurrentUser) -> User:
    """回傳當前 access token 對應的使用者資料。"""
    return current_user


@router.patch("/me", response_model=UserPublic, summary="更新當前登入者資料")
async def update_me(
    payload: UserUpdateRequest,
    current_user: CurrentUser,
    db: DBSession,
) -> User:
    """更新顯示名稱 / 頭像。

    只更新有傳的欄位(其他欄位保持原值)。
    """
    if payload.display_name is not None:
        current_user.display_name = payload.display_name
    if payload.avatar_url is not None:
        current_user.avatar_url = payload.avatar_url

    await db.commit()
    await db.refresh(current_user)
    return current_user
