from django.db.models import Count, Sum
from django.db.models.functions import ExtractMonth

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

from works.models import Work_Sub_Categories
from contracts.models import Work_Contract

from utils.helpers import verify_token


class DashboardView(APIView):

    def get(self, request):

        user = verify_token(request)

        if not user:
            return Response(
                {
                    "success": False,
                    "message": "Invalid token"
                },
                status=status.HTTP_401_UNAUTHORIZED
            )

        # =========================================
        # WORK STATISTICS
        # =========================================

        works_queryset = Work_Sub_Categories.objects.filter(
            contractor=user
        )

        assigned = works_queryset.filter(
            status=1
        ).count()

        started = works_queryset.filter(
            status=2
        ).count()

        completed = works_queryset.filter(
            status=3
        ).count()

        cancelled = works_queryset.filter(
            status=4
        ).count()

        total_works = works_queryset.count()

        performance = (
            round(
                (completed / total_works) * 100,
                2
            )
            if total_works > 0
            else 0
        )

        # =========================================
        # TOTAL EARNINGS
        # =========================================

        total_earnings = 0

        for item in works_queryset.filter(status=3):

            contract = Work_Contract.objects.filter(
                work_id=item.work_id,
                sub_category_id=item.sub_category_id
            ).order_by("-id").first()

            if contract:
                total_earnings += contract.amount
        # =========================================
        # MONTHLY ANALYTICS
        # =========================================

        analytics_queryset = (
            works_queryset
            .annotate(
                month=ExtractMonth(
                    "work__created_at"
                )
            )
            .values("month")
            .annotate(
                total=Count("id")
            )
            .order_by("month")
        )

        months = {
            1: "Jan",
            2: "Feb",
            3: "Mar",
            4: "Apr",
            5: "May",
            6: "Jun",
            7: "Jul",
            8: "Aug",
            9: "Sep",
            10: "Oct",
            11: "Nov",
            12: "Dec",
        }

        monthly_data = {
            i: 0 for i in range(1, 13)
        }

        for item in analytics_queryset:

            month = item.get("month")

            if month:
                monthly_data[month] = item["total"]

        monthly_analytics = []

        for month_number, month_name in months.items():

            monthly_analytics.append(
                {
                    "label": month_name,
                    "value": monthly_data[month_number]
                }
            )

        # =========================================
        # RESPONSE
        # =========================================

        return Response(
            {
                "success": True,
                "status": 200,

                "total_earnings": float(total_earnings),

                "total_works": total_works,

                "performance": performance,

                "assigned": assigned,
                "started": started,
                "completed": completed,
                "cancelled": cancelled,

                "monthly_analytics": monthly_analytics
            },
            status=status.HTTP_200_OK
        )