from rest_framework import viewsets, permissions, status
from .serializers import *
from django_auth_ldap.backend import LDAPBackend
from rest_framework.decorators import action
from rest_framework.response import Response

class UserViewSet(viewsets.GenericViewSet):
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer

    def get_queryset(self):
        return self.request.user

    def list(self, request, format=None):
        # This is a bit stupid: we have a user, we create a queryset by
        # matching on the username. But I don't know a "nicer" way.
        # Nico, 2020-03-18
        user = request.user
        serializer = self.get_serializer(user, context = {'request': request})
        return Response(serializer.data)

    def create(self, request):
        """
        Modify existing user data
        """

        user = request.user
        serializer = self.get_serializer(user,
                                         context = {'request': request},
                                         data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

class AdminUserViewSet(viewsets.ReadOnlyModelViewSet):
    permission_classes = [permissions.IsAdminUser]

    def get_serializer_class(self):
        if self.action == 'import_from_ldap':
            return ImportUserSerializer
        else:
            return UserSerializer

    def get_queryset(self):
        return get_user_model().objects.all()

    @action(detail=False, methods=['post'], url_path='import_from_ldap')
    def import_from_ldap(self, request, pk=None):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        ldap_username = serializer.validated_data.pop("username")
        user = LDAPBackend().populate_user(ldap_username)

        return Response(UserSerializer(user, context = {'request': request}).data)