from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions

from apps.accounts.services import user_service


class UserListView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request):
        # Pass query params through so backend can paginate/filter
        params = request.query_params.dict()
        users = user_service.list_users(params)

        # If the service returned a paginated dict, return it as-is.
        if isinstance(users, dict) and ('results' in users or 'count' in users):
            return Response(users, status=status.HTTP_200_OK)

        # Otherwise wrap list into expected shape
        return Response({'results': users, 'count': len(users)}, status=status.HTTP_200_OK)


class UserDetailView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request, id):
        user = user_service.get_user(id)
        if not user:
            return Response({'detail': 'Not found'}, status=status.HTTP_404_NOT_FOUND)
        return Response(user, status=status.HTTP_200_OK)

    def patch(self, request, id):
        # Only admin users (is_staff) allowed by permission class; extra check for clarity
        if not (request.user and (getattr(request.user, 'is_staff', False) or str(getattr(request.user, 'role', '')).upper() == 'ADMIN')):
            return Response({'detail': 'Forbidden'}, status=status.HTTP_403_FORBIDDEN)

        data = request.data or {}
        try:
            updated = user_service.update_user(id, data)
        except ValueError as exc:
            return Response({'detail': str(exc)}, status=status.HTTP_400_BAD_REQUEST)
        if updated is None:
            return Response({'detail': 'Not found'}, status=status.HTTP_404_NOT_FOUND)
        return Response(updated, status=status.HTTP_200_OK)
