"""
Views module for the pages app.
"""
from django.conf import settings
from django.urls import reverse_lazy
from django.utils import translation
from django.core.mail import send_mail
from django.views.generic import FormView
from django.views.generic import RedirectView
from django.views.generic import TemplateView
from django.contrib.messages.views import SuccessMessageMixin

from ecapp.forms import ContactoForm
from users.forms import NewUserForm
from cards.models import Card
from ecapp.models import Contacto

from .services import get_latest_news


class ChangeLanguageView(RedirectView):
    """
    Change language of the site.
    """

    http_method_names = ["get", "options"]

    def get_redirect_url(self, *args, **kwargs):
        return self.request.META.get("HTTP_REFERER", None) or reverse_lazy(
            "pages:index",
        )

    def get(self, request, *args, **kwargs):
        language_code = kwargs.get("language")
        translation.activate(language_code)

        response = super().get(request, *args, **kwargs)
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language_code)

        return response


class IndexView(TemplateView):
    """
    Index page view.
    Display a landing page for visitors and the news feed for users.
    """

    def get_template_names(self):
        if self.request.user.is_authenticated:
            return ["pages/home.html"]

        return ["pages/landing.html"]

    def get_user_default_card(self):
        return Card.objects.filter(
            user=self.request.user,
            default=True,
        ).first()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        if not self.request.user.is_authenticated:
            context["register_form"] = NewUserForm()

            return context

        context["card"] = self.get_user_default_card()

        context["news"] = get_latest_news()

        return context


class AboutView(TemplateView):
    """
    About view.
    """

    template_name = "pages/about.html"


class ContactView(SuccessMessageMixin, FormView):
    """
    Contact view.
    """

    template_name = "pages/contact.html"

    model = Contacto
    form_class = ContactoForm
    success_url = reverse_lazy("pages:contact")
    success_message = "Message sent successfully"

    def form_valid(self, form):
        send_mail(
            "Contacto EcCard",
            form.cleaned_data["comentario"],
            form.cleaned_data["correo"],
            ["info@eccard.com.mx"],
            fail_silently=False,
        )

        form.save()

        return super().form_valid(form)
