from rest_framework import status
from rest_framework.views import APIView
from django.utils.decorators import decorator_from_middleware_with_args
from django.utils.decorators import method_decorator

from authenticate.middleware import AuthorizatorMiddleware
from utils import utils
from utils.myresponse import MyResponse
from wikiazma.middleware import SerializerValidationMiddleware

from collaborators.middleware import CollaborationAccessMiddleware

from public_resources.models import PublicResource
from public_resources import serializers as public_resources_serializers

serializer_validation_middleware = decorator_from_middleware_with_args(
    SerializerValidationMiddleware)

check_access_permission_middleware = decorator_from_middleware_with_args(
    CollaborationAccessMiddleware)
user_token_or_server_token_or_server_API_key_validation_and_authorization = decorator_from_middleware_with_args(
    AuthorizatorMiddleware)


@method_decorator(user_token_or_server_token_or_server_API_key_validation_and_authorization(accept_user_token=True),
                  name='post')
@method_decorator(serializer_validation_middleware(public_resources_serializers.AddPublicResourceInputSerializer),
                  name='post')
class AddPublicResource(APIView):

    def post(self, request):
        # ########################## Block 1 ################################
        # receiving user inputs from serializer
        title = request.middleware_serializer_data.get('title')
        file_type = request.middleware_serializer_data.get('file_type')
        file = request.middleware_serializer_data.get('file')
        # ########################## Block 2 ################################
        public_resource_record = PublicResource.objects.create(
            user=request.middleware_user,
            title=title,
            file_type=file_type,
            file=file
        )
        public_resource_data = public_resources_serializers.PublicResourceModelSerializer(
            public_resource_record).data
        return MyResponse(request,
                          public_resource_data,
                          status=status.HTTP_200_OK)


# @method_decorator(user_token_or_server_token_or_server_API_key_validation_and_authorization(accept_user_token=True),
#                   name='post')
# @method_decorator(serializer_validation_middleware(public_resources_serializers.EditPublicResourceInputSerializer),
#                   name='post')
# class EditPublicResource(APIView):
#     def post(self, request):
#         title = request.middleware_serializer_data.get('title')
#         public_resources_id = request.middleware_serializer_data.get(
#             'public_resources_id')

#         # public_resource = request.middleware_user
#         try:

#             public_resource = PublicResource.objects.get(
#                 user=request.middleware_user, id=public_resources_id)
#         except:
#             return MyResponse(request, {'status': 'not_found', 'message': 'Public Resource was not found'},  status=status.HTTP_404_NOT_FOUND)

#         if title != None:
#             public_resource.title = title

#         public_resource.save()
#         public_resource_data = public_resources_serializers.PublicResourceModelSerializer(
#             public_resource).data
#         return MyResponse(request,
#                           public_resource_data,
#                           status=status.HTTP_200_OK)


@method_decorator(user_token_or_server_token_or_server_API_key_validation_and_authorization(accept_user_token=True),
                  name='post')
@method_decorator(serializer_validation_middleware(public_resources_serializers.DeletePublicResourceInputSerializer),
                  name='post')
class DeletePublicResource(APIView):

    def post(self, request):
        # ########################## Block 1 ################################
        # receiving user inputs from serializer
        src = request.middleware_serializer_data.get(
            'src')
        name = src.split('/')[-1]
        # ########################## Block 2 ################################
        try:

            public_resource = PublicResource.objects.get(
                file__endswith=name, user=request.middleware_user)
        except:
            return MyResponse(request, {'status': 'error', 'message': 'File not Found'},
                              status=status.HTTP_404_NOT_FOUND)
        public_resource.deleted = True
        public_resource.save()
        return MyResponse(request, {'status': 'ok', 'message': 'Successful'}, status=status.HTTP_200_OK)


@method_decorator(user_token_or_server_token_or_server_API_key_validation_and_authorization(accept_user_token=True),
                  name='post')
@method_decorator(serializer_validation_middleware(public_resources_serializers.PublicResourceListInputSerializer),
                  name='post')
class PublicResourceList(APIView):

    def post(self, request):
        # ########################## Block 1 ################################
        # receiving user inputs from serializer
        q = request.middleware_serializer_data.get('q')
        file_type_q = request.middleware_serializer_data.get('file_type_q')
        sort_by = request.middleware_serializer_data.get('sort_by')
        skip = request.middleware_serializer_data.get('skip')
        take = request.middleware_serializer_data.get('take')
        deleted_filter = request.middleware_serializer_data.get(
            'deleted_filter')
        sort_by_attr = utils.public_resources_sort_by_converter(sort_by)
        # ########################## Block 2 ################################
        public_resources = PublicResource.objects.filter(
            user=request.middleware_user)

        if deleted_filter == 'exclude':
            public_resources = public_resources.filter(deleted=False)
        elif deleted_filter == 'only':
            public_resources = public_resources.filter(deleted=True)

        if q is not None:
            public_resources = public_resources.filter(title__icontains=q)

        if file_type_q:
            public_resources = public_resources.filter(
                file_type__icontains=file_type_q)
        if sort_by:
            public_resources = public_resources.order_by(sort_by_attr)
        public_resources = public_resources[skip:skip + take]
        public_resources_url = public_resources_serializers.PublicResourceModelSerializer(
            public_resources, many=True, context={'request': request}).data
        return MyResponse(request,
                          public_resources_url,
                          status=status.HTTP_200_OK)
