from rest_framework.viewsets import ModelViewSet
from rest_framework import status
from common.myresponse import MyResponse


class MyModelViewSet(ModelViewSet):

    # CreateModelMixin -> create
    def create(self, request, *args, **kwargs):
        print(request.data)
        serializer = self.get_serializer(data=request.data)
        print(serializer)
        serializer.is_valid(raise_exception=True)
        print(serializer.data)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return MyResponse(data=serializer.data, code=201, msg='OK', status=status.HTTP_201_CREATED, headers=headers)

    # ListModelMixin -> list
    def list(self, request, *args, **kwargs):
        print('self.get_queryset()')
        print(self.get_queryset())
        queryset = self.filter_queryset(self.get_queryset())
        print('queryset')
        print(queryset)
        page = self.paginate_queryset(queryset)
        print('page')
        print(page)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            print('serializer')
            print(serializer)
            print('serializer.data')
            print(serializer.data)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        print('serializer')
        print(serializer)
        print('serializer.data')
        print(serializer.data)
        return MyResponse(data=serializer.data, code=200, msg='OK', status=status.HTTP_200_OK)

    # RetrieveModelMixin -> retrieve
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        print(instance)
        serializer = self.get_serializer(instance)
        print(serializer)
        return MyResponse(data=serializer.data, code=200, msg='OK', status=status.HTTP_200_OK)

    # UpdateModelMixin -> update
    def update(self, request, *args, **kwargs):
        print(kwargs)
        partial = kwargs.pop('partial', False)
        print(partial)
        instance = self.get_object()
        print(instance)
        print(request.data)
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        print(serializer)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, '_prefetched_objects_cache', None):
            instance._prefetched_objects_cache = {}
        return MyResponse(data=serializer.data, code=200, msg='OK', status=status.HTTP_200_OK)

    # DestroyModelMixin -> destroy
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return MyResponse(data=[], code=200, msg='OK', status=status.HTTP_204_NO_CONTENT)