from django.contrib.auth import views as auth_views
from django.contrib.auth import logout

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

from .serializers import *

class LoginView(auth_views.LoginView):
    template_name = 'uncloud_auth/login.html'

class LogoutView(auth_views.LogoutView):
    pass


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)

    @action(detail=False, methods=['post'])
    def change_email(self, request):
        serializer = self.get_serializer(
            request.user, data=request.data, context={'request': request}
        )
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)


class AccountManagementViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UserRegistrationSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(
            serializer.data, status=status.HTTP_201_CREATED, headers=headers
        )


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)
