from fastapi import APIRouter, Depends, Request
from sqlalchemy.orm import Session as OrmSession

from app.api.deps import get_db, require_admin
from app.models.catalog import UserAccount
from app.schemas.auth import UserResponse
from app.schemas.common import PaginatedResponse
from app.schemas.user import UserCreate, UserUpdate
from app.services.user_service import UserService

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


@router.get("/", response_model=PaginatedResponse[UserResponse])
def list_users(
    page: int = 1,
    per_page: int = 20,
    admin: UserAccount = Depends(require_admin),
    db: OrmSession = Depends(get_db),
):
    service = UserService(db)
    items, total = service.list_users(page, per_page)
    return PaginatedResponse(
        items=[UserResponse.model_validate(u) for u in items],
        total=total,
        page=page,
        per_page=per_page,
    )


@router.post("/", response_model=UserResponse)
def create_user(
    body: UserCreate,
    request: Request,
    admin: UserAccount = Depends(require_admin),
    db: OrmSession = Depends(get_db),
):
    service = UserService(db)
    ip = request.client.host if request.client else None
    user = service.create_user(
        username=body.username,
        display_name=body.display_name,
        password=body.password,
        role=body.role,
        actor_id=admin.id,
        ip=ip,
    )
    return user


@router.get("/{user_id}", response_model=UserResponse)
def get_user(
    user_id: str,
    admin: UserAccount = Depends(require_admin),
    db: OrmSession = Depends(get_db),
):
    service = UserService(db)
    return service.get_user(user_id)


@router.patch("/{user_id}", response_model=UserResponse)
def update_user(
    user_id: str,
    body: UserUpdate,
    request: Request,
    admin: UserAccount = Depends(require_admin),
    db: OrmSession = Depends(get_db),
):
    service = UserService(db)
    ip = request.client.host if request.client else None
    updates = body.model_dump(exclude_none=True)
    return service.update_user(user_id, updates, admin.id, ip)


@router.delete("/{user_id}", response_model=UserResponse)
def deactivate_user(
    user_id: str,
    request: Request,
    admin: UserAccount = Depends(require_admin),
    db: OrmSession = Depends(get_db),
):
    service = UserService(db)
    ip = request.client.host if request.client else None
    return service.deactivate_user(user_id, admin.id, ip)
