from django.shortcuts import redirect
from .forms import ConfigForm
from .models import Config, MailList
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic import CreateView, ListView, UpdateView, DeleteView, TemplateView
from django.urls import reverse_lazy, reverse
from django.contrib import messages
from django.core.cache import cache


# Create your views here.
class Index(ListView):
    model = Config
    template_name = "backend/config/index.html"

    def get_context_data(self, **kwargs):
        infos = [
            'address',
            'address2',
            'mobile',
            'email',
            'facebook',
            'twitter',
            'instagram',
            'github',
            'linkedin',
            'snapchat',
            'tiktok',
            'pinterest',
            'reddit',
            'telegram',
            'tumblr',
            'threads',
        ]

        for info in infos:
            if not Config.objects.filter(title=info).exists():
                Config.objects.create(title=info, type='text').save()

        context = super().get_context_data(**kwargs)
        context['configs'] = Config.objects.all().exclude(title__in=['terms&conditions', 'privacy&policy'])
        return context


def save_config_values(request):
    if request.method == 'POST':
        configs = Config.objects.all()
        for config in configs:
            value = request.POST.get(config.title)
            if value is not None:
                config.value = value
                config.save()
        messages.success(request, 'Successfully Updated.')
        return redirect('config:index')


class Create(SuccessMessageMixin, CreateView):
    model = Config
    template_name = "backend/config/index.html"
    # form_class = AnswerForm
    success_message = "Config Created Successfully."
    success_url = reverse_lazy('config:index')


class Update(SuccessMessageMixin, UpdateView):
    model = Config
    template_name = "backend/config/index.html"
    # form_class = AnswerForm
    success_message = "Config Updated Successfully."
    success_url = reverse_lazy('config:index')


class Delete(SuccessMessageMixin, DeleteView):
    model = Config
    template_name = "backend/layouts/deletePopUp.html"
    success_message = "Config Deleted Successfully."
    success_url = reverse_lazy('config:index')


def CreateTermsAndConditions(request):
    existing_config = Config.objects.filter(title="terms&conditions").first()

    if not existing_config:
        existing_config = Config(
            title='terms&conditions',
            type='text',
            value='terms and conditions'
        )
        existing_config.save()

    return redirect('config:termsAndCondition.update', pk=existing_config.pk)


class UpdateTermsAndConditions(SuccessMessageMixin, UpdateView):
    model = Config
    template_name = "backend/config/terms-and-conditions/form.html"
    form_class = ConfigForm
    success_message = "Terms And Conditions Created Successfully."

    def get_success_url(self):
        return reverse('config:termsAndCondition.update', args=(self.object.id,))


def CreatePrivacyAndPolicy(request):
    existing_config = Config.objects.filter(title="privacy&policy").first()

    if not existing_config:
        existing_config = Config(
            title='privacy&policy',
            type='text',
            value='Privacy AndPolicy'
        )
        existing_config.save()

    return redirect('config:privacyAndPolicy.update', pk=existing_config.pk)


class UpdatePrivacyAndPolicy(SuccessMessageMixin, UpdateView):
    model = Config
    template_name = "backend/config/privacy-and-policy/form.html"
    form_class = ConfigForm
    success_message = "Privacy And Policy Created Successfully."

    def get_success_url(self):
        return reverse('config:privacyAndPolicy.update', args=(self.object.id,))


class TermsAndConditionsView(TemplateView):
    template_name = 'frontend/terms-and-conditions/index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['config'] = Config.objects.filter(title='terms&conditions').first()
        return context


class PrivacyAndPolicyView(TemplateView):
    template_name = 'frontend/privacy-and-policy/index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['config'] = Config.objects.filter(title='privacy&policy').first()
        return context


def clear_cache(request):
    cache.clear()

    previous_page_url = request.META.get('HTTP_REFERER', None)
    messages.success(request, 'Cache has been cleared.')
    if previous_page_url:
        return redirect(previous_page_url)
    else:
        return redirect('home:index')


class MailListIndex(ListView):
    model = MailList
    template_name = "backend/mailList/index.html"

    def get_queryset(self):
        queryset = super().get_queryset()
        keyword = self.request.GET.get('keyword')
        if keyword:
            queryset = queryset.filter(email__icontains=keyword)
        return queryset.order_by('-id')
