from django.shortcuts import render
from django.utils.decorators import method_decorator, decorator_from_middleware_with_args
from pytz import timezone
from rest_framework.views import APIView
from authenticate.middleware import AuthorizatorMiddleware
from collaborators.models import Access
from institute.models import Institute
from promotion.models import Banner
from promotion.serializers import BannerListInputSerializer, BannerListSerializer
from utils.myresponse import MyResponse
from wikiazma.middleware import SerializerValidationMiddleware
from rest_framework import status
from utils.myresponse import MyResponse
from django.db.models import Q
from django.utils import timezone
# Create your views here.
user_token_or_server_token_or_server_API_key_validation_and_authorization = decorator_from_middleware_with_args(
    AuthorizatorMiddleware)
serializer_validation_middleware = decorator_from_middleware_with_args(
    SerializerValidationMiddleware)


@method_decorator(user_token_or_server_token_or_server_API_key_validation_and_authorization(accept_user_token=True),
                  name='post')
@method_decorator(serializer_validation_middleware(BannerListInputSerializer), name='post')
class BannerList(APIView):
    def post(self, request):
        context_institute_id = request.middleware_serializer_data.get(
            'context_institute_id')
        skip = request.middleware_serializer_data.get('skip')
        take = request.middleware_serializer_data.get('take')

        try:
            access = Access.objects.get(
                institute__id=context_institute_id, user=request.middleware_user)
        except:
            return MyResponse(request,
                              {'status': 'error', 'message': 'BadRequest'},
                              status=status.HTTP_400_BAD_REQUEST)

        banners = Banner.objects.filter(Q(down_time__gte=timezone.now()) | Q(
            down_time__isnull=True), active=True, up_time__lte=timezone.now()).order_by('priority')

        if access.institute.sandbox:
            banners = banners.filter(non_sandbox_visibility_institute=True)
        else:
            banners = banners.filter(sandbox_visibility_institute=True)

        banners = banners[skip:skip + take]

        banner_data = BannerListSerializer(banners, many=True).data
        return MyResponse(request, {'status': 'ok', 'message': 'Successful', 'data': {'banners': banner_data}},
                          status=status.HTTP_200_OK)
