from django.shortcuts import render
from django.shortcuts import redirect
from django.views.generic import View
from django.contrib import messages
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.utils import timezone

from nlu_job.nlu_utils import model_inference, analyze_model_inference, clean_text

from .models import FacebookReview, FacebookReviewReply
from .forms import ReplyForm
from review.models import CustomReply
from .review_utils import reply2facebook_review_using_api
from nlu_job.nlu_utils import filter_with_last_ten_reviews


class FacebookReviews(LoginRequiredMixin, PermissionRequiredMixin, View):
    permission_required = 'is_admin'

    def post(self, request, *args, **kwargs):
        form = ReplyForm(self.request.POST)
        if form.is_valid():
            replied_text = form.cleaned_data.get('reply')
        review_id = self.request.POST['review_id']
        print('review-id', review_id)
        status_code = reply2facebook_review_using_api(
            review_id=review_id,
            reply=replied_text
        )
        if status_code == 200:
            FacebookReviewReply.objects.create(
                review_id=review_id,
                create_time=timezone.now(),
                replied_text=replied_text
            )
            messages.success(request, f'Your reply has been posted!')
        elif status_code == 404:
            FacebookReviewReply.objects.create(
                review_id=review_id,
                create_time=timezone.now(),
                replied_text=replied_text
            )
            messages.warning(request, f'User might delete this reply.!')
        else:
            messages.error(request, 'Something going wrong please notify the developers.')
        return redirect('facebook-reviews')

    def get(self, request, *args, **kwargs):
        now = timezone.now()
        form = ReplyForm()
        date = now - timezone.timedelta(days=7)

        reviews = FacebookReview.objects.filter(
            facebookreviewreply=None,
            create_time__gte=date
        ).order_by('create_time')

        page = request.GET.get('page', 1)
        paginator = Paginator(reviews, 10)
        try:
            reviews = paginator.page(page)
        except PageNotAnInteger:
            reviews = paginator.page(1)
        except EmptyPage:
            reviews = paginator.page(paginator.num_pages)
        context = {'reviews': reviews, 'form': form}
        return render(request, 'facebook-reviews.html', context=context)


class FacebookReviewPrediction(LoginRequiredMixin, PermissionRequiredMixin, View):
    permission_required = 'is_admin'

    def get(self, request, id,  *args, **kwargs):
        review = FacebookReview.objects.get(pk=id)
        review_text = clean_text(review.review_text)
        res = model_inference(review_text)
        intents = analyze_model_inference(res)
        replies = {}
        for intent in intents.keys():
            r = CustomReply.objects.filter(reply_category=intent)
            filtered_replies = filter_with_last_ten_reviews(review.page.location_id, r)
            replies[intent] = filtered_replies

        now = timezone.now()
        form = ReplyForm()
        date = now - timezone.timedelta(days=7)

        reviews = FacebookReview.objects.filter(
            facebookreviewreply=None,
            create_time__gte=date
        ).order_by('create_time')

        page = request.GET.get('page', 1)
        paginator = Paginator(reviews, 10)
        try:
            reviews = paginator.page(page)
        except PageNotAnInteger:
            reviews = paginator.page(1)
        except EmptyPage:
            reviews = paginator.page(paginator.num_pages)
        context = {
            'reviews': reviews,
            'form': form,
            'intents': intents,
            'replies': replies,

        }
        return render(request, 'facebook-reviews.html', context=context)