from urllib.error import HTTPError
from django.http import HttpResponseRedirect
from django.forms import inlineformset_factory
from django.shortcuts import redirect, render
from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from package.models import CostPlan,SubPlan, SubTransaction, UserSub
from django.urls import reverse, reverse_lazy
from django.views.generic import TemplateView,ListView
from django.views.generic.edit import CreateView
from django.contrib import messages
import stripe

from product.models import Product
from . import forms
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Count

# @method_decorator([staff_member_required],name="dispatch")

class Dashboard(LoginRequiredMixin,TemplateView):
    template_name="qrAdmin/dashboard.html"

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        product=Product.objects.values("created_at__month").annotate(count=Count("created_at__month"))
        context['data']=list(product.values_list('count',flat=True))
        context['month']=list(product.values_list("created_at__month", flat=True))
        category=Product.objects.values("category__cat_name").annotate(count=Count("id"))
        context["category_data"]=list(category.values_list('count',flat=True))
        context["category_label"]=list(category.values_list('category__cat_name',flat=True))  
        return self.render_to_response(context)
@method_decorator([staff_member_required],name="get")
class SubscriptionPlanList(ListView):
    models = SubPlan
    queryset= SubPlan.objects.all()

class SubPlanCreate(CreateView):
    # pylint: disable=arguments-differ, attribute-defined-outside-init
    model = SubPlan
    # permission_required = 'subscriptions.subscriptions'
    raise_exception = True
    context_object_name = 'plan'
    form_class = forms.SubPlan
    success_message = 'Subscription plan successfully added'
    success_url = reverse_lazy('package:list-sub-plan')
    template_name = 'package/subplan_create.html'

    def get(self, request, *args, **kwargs):
        """Overriding get method to handle inline formset."""
        # Setup the formset for PlanCost
        PlanCostFormSet = inlineformset_factory(  # pylint: disable=invalid-name
            parent_model=SubPlan,
            model=CostPlan,
            form=forms.PlanCostForm,
            can_delete=False,
            extra=1,
        )

        self.object = None
        form = self.get_form(self.get_form_class())
        cost_forms = PlanCostFormSet()

        return self.render_to_response(
            self.get_context_data(
                form=form,
                cost_forms=cost_forms,
            )
        )
    def post(self, request, *args, **kwargs):
        """Overriding post method to handle inline formsets."""
        # Setup the formset for PlanCost
        PlanCostFormSet = inlineformset_factory(  # pylint: disable=invalid-name
            parent_model=SubPlan,
            model=CostPlan,
            form=forms.PlanCostForm,
            can_delete=False,
            extra=1,
        )

        self.object = None
        form = self.get_form(self.get_form_class())
        cost_forms = PlanCostFormSet(self.request.POST)

        if form.is_valid() and cost_forms.is_valid():
            return self.form_valid(form, cost_forms)

        return self.form_invalid(form, cost_forms)
    def form_valid(self, form, cost_forms):
        self.object = form.save()
        cost_forms.instance = self.object
        cost_forms.save()

        # Generate the success message
        messages.success(self.request, self.success_message)

        return HttpResponseRedirect(self.get_success_url())
    def form_invalid(self, form, cost_forms):
        return self.render_to_response(
            self.get_context_data(
                form=form,
                cost_forms=cost_forms,
            )
        )

class SubTransactionList(ListView):
    models = SubTransaction
    queryset= SubTransaction.objects.all()
    template="package/subtransaction_list.html"

class UserSubList(ListView):
    models = UserSub
    queryset= UserSub.objects.all()
    template="package/usersub_list.html"

def paymentjson(request):
    session = stripe.checkout.Session.retrieve(stripe_id)

