from uuid import UUID
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession

from src.apps.auth.schemas.responses import UserResponse
from src.apps.users.schemas.requests import InviteUserRequest, UpdateUserRequest
from src.apps.users.services.user_service import UserService
from src.core.dependencies import require_roles
from src.core.constants import UserRole
from src.core.schemas.response import success, paginated
from src.database.session import get_db

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


@router.get("", response_model=dict)
async def list_users(
    skip: int = Query(0, ge=0),
    limit: int = Query(20, ge=1, le=100),
    search: str = Query(None),
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR, UserRole.MANAGER)),
    db: AsyncSession = Depends(get_db),
):
    service = UserService(db)
    users, total = await service.list_users(current_user.tenant_id, skip, limit, search)
    return paginated(
        items=[UserResponse.model_validate(u).model_dump() for u in users],
        total=total,
        page=(skip // limit) + 1,
        page_size=limit,
    )


@router.post("/invite", response_model=dict, status_code=201)
async def invite_user(
    body: InviteUserRequest,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR)),
    db: AsyncSession = Depends(get_db),
):
    service = UserService(db)
    user = await service.create_user(current_user.tenant_id, body.model_dump())
    return success(data=UserResponse.model_validate(user).model_dump(), message="User invited")


@router.get("/{user_id}", response_model=dict)
async def get_user(
    user_id: UUID,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR, UserRole.MANAGER)),
    db: AsyncSession = Depends(get_db),
):
    service = UserService(db)
    user = await service.get_by_id(user_id, current_user.tenant_id)
    if not user:
        from src.core.exceptions import NotFoundError
        raise NotFoundError("User not found")
    return success(data=UserResponse.model_validate(user).model_dump())


@router.patch("/{user_id}", response_model=dict)
async def update_user(
    user_id: UUID,
    body: UpdateUserRequest,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR)),
    db: AsyncSession = Depends(get_db),
):
    service = UserService(db)
    user = await service.update_user(user_id, current_user.tenant_id, body.model_dump(exclude_none=True))
    return success(data=UserResponse.model_validate(user).model_dump(), message="User updated")


@router.delete("/{user_id}", status_code=204)
async def deactivate_user(
    user_id: UUID,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR)),
    db: AsyncSession = Depends(get_db),
):
    service = UserService(db)
    await service.deactivate_user(user_id, current_user.tenant_id)
