from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render
from django.views import View
from django.views.generic import ListView

from apps.promotions.forms import PromoCodeForm
from apps.promotions.models import PromoCode, PromoRedemption
from utils.permissions import AdminRequiredMixin


class AdminPromoListView(AdminRequiredMixin, ListView):
    template_name = 'promotions/admin_promo_list.html'
    context_object_name = 'promos'
    queryset = PromoCode.objects.all()


class AdminPromoCreateView(AdminRequiredMixin, View):
    template_name = 'promotions/admin_promo_form.html'

    def get(self, request):
        return render(request, self.template_name, {
            'form': PromoCodeForm(),
            'action': 'Create promo code',
        })

    def post(self, request):
        form = PromoCodeForm(request.POST)
        if form.is_valid():
            promo = form.save(commit=False)
            promo.created_by = request.user
            promo.save()
            messages.success(request, f'Promo code {promo.code} created for {promo.institute_name}.')
            return redirect('promotions:admin_list')
        return render(request, self.template_name, {'form': form, 'action': 'Create promo code'})


class AdminPromoEditView(AdminRequiredMixin, View):
    template_name = 'promotions/admin_promo_form.html'

    def get(self, request, pk):
        promo = get_object_or_404(PromoCode, pk=pk)
        return render(request, self.template_name, {
            'form': PromoCodeForm(instance=promo),
            'promo': promo,
            'action': 'Edit promo code',
        })

    def post(self, request, pk):
        promo = get_object_or_404(PromoCode, pk=pk)
        form = PromoCodeForm(request.POST, instance=promo)
        if form.is_valid():
            form.save()
            messages.success(request, 'Promo code updated.')
            return redirect('promotions:admin_list')
        return render(request, self.template_name, {
            'form': form, 'promo': promo, 'action': 'Edit promo code',
        })


class AdminPromoRedemptionsView(AdminRequiredMixin, ListView):
    template_name = 'promotions/admin_redemptions.html'
    context_object_name = 'redemptions'
    queryset = PromoRedemption.objects.select_related(
        'promo', 'user', 'enrollment__course', 'certification_application__program'
    )
