"""ScheduledCampaings views file."""
from django.http import HttpResponse
from django.shortcuts import render
from django_filters import rest_framework as filters
from rest_framework import status
from rest_framework.generics import ListAPIView
from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework.permissions import BasePermission
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView

from campaigns.models import DestinationChoices
from places.models import Place
from scheduledcampaigns.admin import ScheduledCampaignAdminForm
from scheduledcampaigns.filters import EventsFilter
from scheduledcampaigns.models import ScheduledCampaign
from scheduledcampaigns.serializers import EventSerializer, EventsQueryParamsSerializer


class PlannerPermission(BasePermission):
    """Permission class for dashboard view."""

    def has_permission(self, request: Request, _: APIView) -> bool:
        """Check if user has view permission."""
        return request.user.has_perm("scheduledcampaigns.can_use_planner")

    def has_object_permission(self, request: Request, _: APIView, __: ScheduledCampaign) -> bool:
        """Check if user has object permission."""
        return request.user.has_perm("scheduledcampaigns.can_use_planner")


class PlannerView(APIView):
    """ScheduledCampaigns planner view."""

    parser_classes = (FormParser, MultiPartParser)
    permission_classes = [PlannerPermission]

    def get(self, request: Request) -> HttpResponse:
        """GET view for planner."""
        places = Place.objects.all()
        form = ScheduledCampaignAdminForm()
        return render(
            request,
            "planner.html",
            {
                "destinations": DestinationChoices.values,
                "places": places,
                "form": form,
            },
        )

    def post(self, request: Request) -> Response:
        """POST view for planner's form."""
        form = ScheduledCampaignAdminForm(request.POST)
        if form.is_valid():
            form.save()
            return Response(status=status.HTTP_201_CREATED)
        return Response(status=status.HTTP_400_BAD_REQUEST, data=form.errors)


class Events(ListAPIView):
    """View for getting all scheduled campaings for given dates, destination and place."""

    queryset = ScheduledCampaign.objects.all()
    serializer_class = EventSerializer
    filterset_class = EventsFilter
    filter_backends = [filters.DjangoFilterBackend]
    permission_classes = [PlannerPermission]

    def get(self, request: Request, *args: tuple, **kwargs: dict[str, any]) -> Response:
        """Override get to validate query params."""
        EventsQueryParamsSerializer(data=request.GET).is_valid(raise_exception=True)
        return super().get(request, *args, **kwargs)
