import random

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from django.views.generic import ListView, TemplateView

from apps.products.models import SubProduct

from .forms import ContactForm
from .models import AboutSection, ContactSubmission, FAQEntry, HeroSection, HomepageSection


class HomeView(TemplateView):
    template_name = "pages/home.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["hero"] = HeroSection.objects.first()
        ctx["homepage_sections"] = (
            HomepageSection.objects.filter(is_active=True)
            .prefetch_related("items")
            .order_by("order")
        )
        ctx["sub_products"] = (
            SubProduct.objects.filter(is_active=True, show_on_homepage=True)
            .select_related("main_product")
            .order_by("homepage_order", "order")
        )
        return ctx


class AboutView(TemplateView):
    template_name = "pages/about.html"

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx["about_sections"] = (
            AboutSection.objects.filter(is_active=True)
            .prefetch_related("items")
            .order_by("order")
        )
        return ctx


class FAQView(ListView):
    model = FAQEntry
    template_name = "pages/faq.html"
    context_object_name = "faq_entries"
    queryset = FAQEntry.objects.filter(is_active=True)


class ContactView(View):
    template_name = "pages/contact.html"

    def _new_captcha(self, request):
        a, b = random.randint(1, 9), random.randint(1, 9)
        request.session["captcha_answer"] = a + b
        return f"{a} + {b}"

    def get(self, request, *args, **kwargs):
        return render(
            request,
            self.template_name,
            {"form": ContactForm(), "captcha_question": self._new_captcha(request)},
        )

    def post(self, request, *args, **kwargs):
        form = ContactForm(request.POST)
        expected = request.session.get("captcha_answer")
        captcha_question = self._new_captcha(request)

        captcha_ok = False
        try:
            captcha_ok = int(request.POST.get("captcha_answer", "")) == expected
        except (ValueError, TypeError):
            pass

        if form.is_valid() and captcha_ok:
            form.save()
            return JsonResponse({"success": True})

        errors: dict = {}
        if not captcha_ok:
            errors["captcha"] = ["Incorrect answer — please try again."]
        errors.update(
            {field: [str(e) for e in errs] for field, errs in form.errors.items()}
        )
        return JsonResponse(
            {"success": False, "errors": errors, "captcha_question": captcha_question},
            status=400,
        )
