from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
from django.http import JsonResponse
from django.contrib.auth import login

from rest_framework.views import APIView
from rest_framework import permissions
from rest_framework.authtoken.serializers import AuthTokenSerializer
from knox.views import LoginView as KnoxLoginView

from core.toplist import TopList, fetch_new_orders


class LoginView(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):
        serializer = AuthTokenSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data["user"]
        login(request, user)
        return super(LoginView, self).post(request, format=None)


class TopListView(APIView):
    def get(self, request):
        now = datetime.now(ZoneInfo("Europe/Berlin"))
        subset = request.query_params.get("subset")
        match request.query_params.get("filtertemplate"):
            case "24h":
                toplist = TopList.from_db(now - timedelta(hours=24), now, subset)
            case "today":
                toplist = TopList.from_db(
                    now.replace(hour=0, minute=0, second=0, microsecond=0), now, subset
                )
            case "yesterday":
                start = (now - timedelta(hours=24)).replace(
                    hour=0, minute=0, second=0, microsecond=0
                )
                end = start.replace(hour=23, minute=59, second=59, microsecond=999999)
                toplist = TopList.from_db(start, end, subset)
            case "daybeforeyesterday":
                end = (now - timedelta(hours=24)).replace(
                    hour=0, minute=0, second=0, microsecond=0
                )
                start = end - timedelta(hours=24)
                toplist = TopList.from_db(start, end, subset)
            case "unshipped":
                toplist = TopList.from_db_unshipped()
            case _:
                toplist = TopList.from_db(subset=subset)
        return JsonResponse(toplist.as_json())


class TopListDBUpdateView(APIView):
    permission_classes = (permissions.AllowAny,)

    def get(self, _):
        fetch_new_orders()
        return JsonResponse({})

    def post(self, _):
        fetch_new_orders()
        return JsonResponse({})
