from rest_framework.generics import (ListAPIView, CreateAPIView, UpdateAPIView, RetrieveAPIView, DestroyAPIView)
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.response import Response

from django.shortcuts import get_object_or_404

from datetime import datetime

from apps.client.serializers.client_serializers import ClientListSerializer, ClientStoreSerializer, \
    ClientDetailSerializer, ClientDeleteAPISerializer
from apps.client.models import Client


class ClientListAPIView(ListAPIView):
    serializer_class = ClientListSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['name', 'phone_no', 'address', ]
    ordering_fields = ['id', 'name', 'phone_no', 'address', ]

    def get_queryset(self):
        with_trashed = self.request.query_params.get('with_trashed')

        queryset = Client.objects.only('id', 'name',)

        if with_trashed == 'true':
            queryset = Client.objects.with_trashed()

        return queryset


class ClientCreateAPIView(CreateAPIView):
    serializer_class = ClientStoreSerializer

    queryset = Client.objects.only('id', 'name', 'phone_no', 'address')


class ClientEditAPIView(UpdateAPIView):
    http_method_names = ['patch']
    serializer_class = ClientStoreSerializer
    queryset = Client.objects.all()


class ClientDeleteAPIView(DestroyAPIView):
    serializer_class = ClientDeleteAPISerializer

    def delete(self, request, pk, *args, **kwargs):
        client = get_object_or_404(Client, pk=pk)

        client.project_set.update(deleted_by=self.request.user, deleted_at=datetime.now())

        Client.objects.filter(id=pk).update(deleted_by=self.request.user, deleted_at=datetime.now())

        serializer = self.serializer_class(client)

        return Response(serializer.data)


class ClientDetailAPIView(RetrieveAPIView):
    serializer_class = ClientDetailSerializer
    queryset = Client.objects.with_trashed()