import json

from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse, HttpResponseForbidden, JsonResponse
from django.shortcuts import render
from django.views import View
from rest_framework.parsers import FormParser
from rest_framework.views import APIView

from core.lib.opensearch import query_results
from core.lib.threshold import (
    annotate_num_chans,
    annotate_num_users,
    get_chans,
    get_users,
)


class Drilldown(LoginRequiredMixin, View):
    template_name = "ui/drilldown/drilldown.html"
    plan_name = "drilldown"

    def get(self, request):
        if not request.user.has_plan(self.plan_name):
            return render(request, "denied.html")
        context = {
            "sizes": settings.OPENSEARCH_MAIN_SIZES,
        }
        return render(request, self.template_name, context)


class DrilldownSearch(LoginRequiredMixin, View):
    # parser_classes = [JSONParser]
    template_name = "ui/drilldown/results.html"
    plan_name = "drilldown"

    def post(self, request):
        if not request.user.has_plan(self.plan_name):
            return HttpResponseForbidden()

        context = query_results(request)
        if not context:
            return HttpResponseForbidden()
        context["data"] = json.dumps(
            [
                {
                    "text": item.get("msg", None) or item.get("id"),
                    "nick": item.get("nick", None),
                    "value": item.get("sentiment", None) or None,
                    "date": item.get("ts"),
                }
                for item in context["results"]
            ]
        )
        if context:
            return render(request, self.template_name, context)
        else:
            return HttpResponse("No results")


class ThresholdInfoModal(LoginRequiredMixin, APIView):
    parser_classes = [FormParser]
    plan_name = "drilldown"
    template_name = "modals/drilldown.html"

    def post(self, request):
        if not request.user.has_plan(self.plan_name):
            return JsonResponse({"success": False})
        if "net" not in request.data:
            return JsonResponse({"success": False})
        if "nick" not in request.data:
            return JsonResponse({"success": False})
        if "channel" not in request.data:
            return JsonResponse({"success": False})
        net = request.data["net"]
        nick = request.data["nick"]
        channel = request.data["channel"]
        channels = get_chans(net, [nick])
        users = get_users(net, [channel])
        num_users = annotate_num_users(net, channels)
        num_chans = annotate_num_chans(net, users)
        if channels:
            inter_users = get_users(net, channels)
        else:
            inter_users = []
        if users:
            inter_chans = get_chans(net, users)
        else:
            inter_chans = []
        context = {
            "net": net,
            "nick": nick,
            "channel": channel,
            "chans": channels,
            "users": users,
            "inter_chans": inter_chans,
            "inter_users": inter_users,
            "num_users": num_users,
            "num_chans": num_chans,
        }
        return render(request, self.template_name, context)
