from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView

from django.db.models import OuterRef, Subquery

from apps.employee.models import Activity, TimeSheet



class ActivityTimeSheetListView(APIView):

    def get(self, request):
        start_date = request.GET.get('start_date')
        end_date = request.GET.get('end_date')

        if not start_date or not end_date:
            return Response({"success": False, "message":"start_date and end_date are required"}, status=status.HTTP_400_BAD_REQUEST)


        time_sheet = TimeSheet.objects.filter(clock_in_date_time__date=OuterRef('start_date_time__date')).order_by('-id')

        activities = Activity.objects.filter(start_date_time__date__gte=start_date, start_date_time__date__lte=end_date) \
                    .annotate(
                        clock_in_date=Subquery(time_sheet.values('clock_in_date_time__date')[:1]),
                        clock_in_date_time=Subquery(time_sheet.values('clock_in_date_time__time')[:1]),
                        clock_out_date_time=Subquery(time_sheet.values('clock_out_date_time__time')[:1]),
                        time_sheet_total_duration=Subquery(time_sheet.values('total_duration')[:1])
                    )

        temp_data = {}
        response_data = []
        for activity in activities:
            if not str(activity.clock_in_date) in temp_data:
                temp_data[str(activity.clock_in_date)] = {
                    'clock_in_date': activity.clock_in_date,
                    'clock_in_time': activity.clock_in_date_time,
                    'clock_out_time': activity.clock_out_date_time,
                    'total_duration': str(activity.time_sheet_total_duration),
                    'activities': []
                }

            activity_data = {
                'project_name': activity.project.name,
                'activity_type': activity.activity_type.name,
                'start_date_time': activity.start_date_time,
                'end_date_time': activity.end_date_time,
                'total_duration': str(activity.total_duration)
            }

            temp_data[str(activity.clock_in_date)]['activities'].append(activity_data)

        response_data = [v for k, v in list(temp_data.items())]

        return Response(response_data)