from django.utils.translation import gettext_lazy as _
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy

from django.views.generic.base import RedirectView, TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, FormView,
                                       UpdateView)
from django.views.generic.list import ListView

from orchestra.contrib.musician.mixins import (CustomContextMixin, ExtendedPaginationMixin,
                     UserTokenRequiredMixin)

from orchestra.contrib.websites.models import Website, Content, WebsiteDirective
from .forms import ( WebsiteUpdateForm, WesiteContentCreateForm,
                                                            WesiteDirectiveCreateForm)


class WebsiteListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
    model = Website
    template_name = "musician/websites/website_list.html"
    extra_context = {
        # Translators: This message appears on the page title
        'title': _('Websites'),
    }

    def get_queryset(self):
        return self.model.objects.filter(account=self.request.user)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update({
            'description': _("A website is the place where a domain is associated with the directory where the web files are located. (WebApp)"),
        })
        return context
    

class WebsiteDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView):
    template_name = "musician/websites/website_detail.html"
    extra_context = {
        # Translators: This message appears on the page title
        'title': _('website details'),
    }

    def get_queryset(self):
        return Website.objects.filter(account=self.request.user)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['content'] = Content.objects.filter(website=self.object)
        context['directives'] = WebsiteDirective.objects.filter(website=self.object)
        return context
    

class WebsiteUpdateView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
    model = Website
    form_class = WebsiteUpdateForm
    template_name = "musician/websites/website_form.html"

    def get_queryset(self):
        qs = Website.objects.filter(account=self.request.user)
        return qs

    def get_success_url(self):
        return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
    
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs["user"] = self.request.user
        return kwargs


class WebsiteDeleteContentView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
    model = Content
    template_name = "musician/websites/websiteoption_check_delete.html"
    pk_url_kwarg = "content_pk"

    def get_queryset(self):
        qs = Content.objects.filter(website__account=self.request.user, website=self.kwargs["pk"])
        return qs

    def get_success_url(self):
        return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
    
    def delete(self, request, *args, **kwargs):
        object = self.get_object()
        response = super().delete(request, *args, **kwargs)
        object.website.save()
        return response


class WebsiteDeleteDirectiveView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
    model = WebsiteDirective
    template_name = "musician/websites/websiteoption_check_delete.html"
    pk_url_kwarg = "directive_pk"

    def get_queryset(self):
        qs = WebsiteDirective.objects.filter(website__account=self.request.user, website=self.kwargs["pk"])
        return qs

    def get_success_url(self):
        return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})
    
    def delete(self, request, *args, **kwargs):
        object = self.get_object()
        response = super().delete(request, *args, **kwargs)
        object.website.save()
        return response


class WebsiteAddContentView(CustomContextMixin, UserTokenRequiredMixin, CreateView):
    model = Content
    form_class = WesiteContentCreateForm
    template_name = "musician/websites/website_create_option_form.html"

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        website = get_object_or_404(Website, account=self.request.user, pk=self.kwargs["pk"])
        kwargs['website'] = website
        kwargs["user"] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})


class WebsiteAddDirectiveView(CustomContextMixin, UserTokenRequiredMixin, CreateView):
    model = WebsiteDirective
    form_class = WesiteDirectiveCreateForm
    template_name = "musician/websites/website_create_option_form.html"

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        website = get_object_or_404(Website, account=self.request.user, pk=self.kwargs["pk"])
        kwargs['website'] = website
        return kwargs

    def get_success_url(self):
        return reverse_lazy("musician:website-detail", kwargs={"pk": self.kwargs["pk"]})