import uuid

from django.contrib.auth import logout
from django.contrib.auth import login
# this line import the methods de autenticación de Django.
from django.contrib.auth import authenticate
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse
from django.shortcuts import render, redirect
from django.utils import timezone
from django.views import View
from django.views.generic import CreateView

from apps.base.forms import ContactoForm, RegistroForm
from apps.base.helpers import send_forget_password_mail
from apps.base.models import Contacto
from apps.usuarios.models import Usuario
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy

from vitalappdjango import settings


def welcome(request):
    if request.user.is_authenticated:
        username = request.user.username
        template_name = "principal.html"
        return HttpResponseRedirect(reverse_lazy('main'))
    else:
        template_name = "home.html"
    return render(request, template_name)


class login_authenticated(SuccessMessageMixin, View):
    template_name = 'login.html'

    def get(self, request):
        if request.user.is_authenticated:
            username = request.user.username
            templates = "principal.html"
            return HttpResponseRedirect(reverse_lazy('main'))
        else:
            return render(request, self.template_name)

    @staticmethod
    def post(request):
        email = request.POST['email']
        passw = request.POST['password']
        print("email", email)
        print("passw", passw)

        if request.method == 'POST':
            if email != "":
                if passw != "":
                    user = authenticate(username=email, password=passw)
                    print("==><>", user)
                    if user is not None and user.is_active:
                        print("active")
                        login(request, user)
                    else:
                        usuario = Usuario.objects.filter(email=email).exists()
                        if not usuario:
                            messages.error(request, ('Usuario no esta registrado'))
                        else:
                            contra = Usuario.objects.filter(password=passw).exists()
                            if not contra:
                                messages.error(request, 'La contraseña es incorrecta')
                else:
                    messages.error(request, 'Digita una contraseña')
            else:
                messages.error(request, 'Digita un email')
        else:
            messages.error(request, ('Metodo incorrecto'))
        return redirect(reverse('login', args=()))


def Cerrar_Sesion(request):
    request.session.flush()
    logout(request)
    return redirect('inicio')


class Registrar(CreateView, SuccessMessageMixin):
    model = Contacto
    form_class = ContactoForm
    template_name = 'register.html'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name, context={'form': RegistroForm()})

    def post(self, request, *args, **kwargs):
        form = RegistroForm(request.POST)
        if form.is_valid():
            new_register = form.save(commit=False)
            new_register.username = str(form.cleaned_data['first_name']) + str(form.cleaned_data['email'])
            new_register.save()
            form.save_m2m()
            print('Datos ==>', form)
            messages.success(request, 'Registro enviado!')
            return HttpResponseRedirect(reverse_lazy('login'))
        else:
            messages.error(request, ('No se pudo enviar el registro'))
        return render(request, self.template_name, context={'form': RegistroForm()})


class Contactenos(CreateView, SuccessMessageMixin):
    model = Contacto
    form_class = ContactoForm
    template_name = 'contac.html'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name, context={'form': ContactoForm()})

    def post(self, request, *args, **kwargs):
        form = ContactoForm(request.POST)
        extra = request.POST
        if form.is_valid():
            registro = form.save(commit=False)
            registro.published = timezone.now()
            registro.save()
            messages.success(request, 'Mensaje enviado!')
        else:
            messages.error(request, ('No se pudo enviar el mensaje'))
        return render(request, self.template_name, context={'form': ContactoForm()})


class ResetPWD(View):
    model = Usuario
    template_name = 'recovery_pass/forget_password.html'
    success_url = reverse_lazy('inicio')
    success_message = 'Correo Enviado'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name, context={})

    def post(self, request, *args, **kwargs):
        email = request.POST['email']
        if request.method == 'POST':
            if email != "":
                if not Usuario.objects.filter(email=email).first():
                    messages.success(request, 'No se encontro un usuario con este email')
                    return redirect('/olvide_contraseña/')
                user_obj = Usuario.objects.get(email=email)
                token = uuid.uuid4()
                url = settings.DOMAIN if not settings.DEBUG else self.request.META['HTTP_HOST']
                data = send_forget_password_mail(user_obj.email, token, url)
                if str(data) == '{} !':
                    messages.success(request, self.success_message)
                else:
                    messages.success(request, 'Mensaje Enviado!')
            else:
                messages.success(request, ('Digita un Email'))
        return render(request, self.template_name, context={})

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Reseteo de Contraseña'
        return context


class ChangePDW(View):
    model = Usuario
    template_name = 'recovery_pass/change_password.html'
    success_url = reverse_lazy('inicio')
    success_message = 'Contraseña Actualizada'

    def get(self, request, *args, **kwargs):
        token = self.kwargs['token']
        if Usuario.objects.filter(token=token).exists():
            return render(request, self.template_name, context={})
        return HttpResponseRedirect('/')

    def post(self, request, *args, **kwargs):
        token = self.kwargs['token']
        if request.method == 'POST':
            new_password = request.POST.get('new_password')
            confirm_password = request.POST.get('reconfirm_password')
            if new_password != confirm_password:
                messages.success(request, 'Ambas contraseñas deben ser iguales')
            else:
                user_obj = Usuario.objects.get(token=token)
                try:
                    user_obj.set_password(new_password)
                    user_obj.save()
                    return HttpResponseRedirect(reverse_lazy('inicio'))
                except Exception as e:
                    print(e)
        return render(request, self.template_name, context={})


class Terminos(SuccessMessageMixin, View):
    template_name = 'terminos.html'

    def get(self, request, *args, **kwargs):
        return render(self.request, self.template_name, context={})

    def post(self, request, *args, **kwargs):
        return render(self.request, self.template_name, context={})


class Privacidad(SuccessMessageMixin, View):
    template_name = 'privacidad.html'

    def get(self, request, *args, **kwargs):
        return render(self.request, self.template_name, context={})

    def post(self, request, *args, **kwargs):
        return render(self.request, self.template_name, context={})