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

from django.shortcuts import get_object_or_404

from datetime import datetime

from apps.employee.serializers.activity_type_serializers import ActivityTypeListSerializer, ActivityStartAPISerializer, \
        ActivityCompleteAPISerializer, ActivityTypeCreateSerializer, ActivityTypeDetailSerializer, ActivityEditSerializer, \
        ActivityTypeDeleteSerializer, ActivityDeleteAPISerializer, ActivityDetailSerialzier
from apps.employee.models import ActivityType, Activity

from apps.employee.services.activity_services import start_activity, complete_activity



class ActivityTypeListAPIView(ListAPIView):
    serializer_class = ActivityTypeListSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['name']
    ordering_fields = ['id', 'name', 'is_location_required', ]

    def get_queryset(self):
        is_active = self.request.query_params.get('is_active')
        with_trashed = self.request.query_params.get('with_trashed')
        queryset = ActivityType.objects.only('id', 'name')

        if is_active is not None:
            is_active_filter = is_active.lower() == 'true'
            queryset = queryset.filter(is_active=is_active_filter)
        elif with_trashed == 'true':
            queryset = ActivityType.objects.with_trashed()


        return queryset


class ActivityTypeCreateAPIView(CreateAPIView):
    serializer_class = ActivityTypeCreateSerializer


class ActivityTypeUpdateAPIView(UpdateAPIView):
    http_method_names = ['patch']
    serializer_class = ActivityTypeCreateSerializer
    queryset = ActivityType.objects.all()


class ActivityTypeDeleteAPIView(DestroyAPIView):
    serializer_class = ActivityTypeDeleteSerializer

    def delete(self, request, pk, *args, **kwargs):
        activity_type = get_object_or_404(ActivityType, pk=pk)

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

        serializer = self.serializer_class(activity_type)

        return Response(serializer.data)


class ActivityStartAPIView(CreateAPIView):
    serializer_class = ActivityStartAPISerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'user': self.request.user})
        serializer.is_valid(raise_exception=True)

        user_pay_per_hour = self.request.user.pay_per_hour

        serializer.validated_data['user'] = self.request.user
        serializer.validated_data['pay_per_hour'] = user_pay_per_hour

        start_activity(serializer.validated_data)

        return Response(serializer.data)


class ActivityCompleteAPIView(UpdateAPIView):
    serializer_class = ActivityCompleteAPISerializer
    http_method_names = ['patch']

    def patch(self, request, pk, *args, **kwargs):
        activity = get_object_or_404(Activity, pk=pk)

        serializer = self.serializer_class(instance=activity, data=request.data)
        serializer.is_valid(raise_exception=True)

        complete_activity(pk, serializer.validated_data)

        return Response(serializer.data)


class ActivityTypeDetailAPIView(RetrieveAPIView):
    serializer_class = ActivityTypeDetailSerializer
    queryset = ActivityType.objects.with_trashed()


class ActitvityEditAPIView(UpdateAPIView):
    http_method_names = ['patch']
    serializer_class = ActivityEditSerializer
    queryset = Activity.objects.select_related('project', 'activity_type')


class ActivityDetailAPIView(RetrieveAPIView):
    serializer_class = ActivityDetailSerialzier
    queryset = Activity.objects.with_trashed().select_related('project', 'activity_type')


class ActivityDeleteAPIView(DestroyAPIView):
    serializer_class = ActivityDeleteAPISerializer

    def delete(self, request, pk, *args, **kwargs):
        activity = get_object_or_404(Activity, pk=pk)

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

        serializer = self.serializer_class(activity)

        return Response(serializer.data)