from pickle import TRUE
from django.shortcuts import render

# Create your views here.
from django.shortcuts import render, redirect

from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from validate_email import validate_email

from django.contrib.auth.password_validation import validate_password, ValidationError

from django.core.exceptions import ValidationError
from django.core.validators import validate_email
from django.utils.translation import gettext as _

import gardens
from usercontrol.models import Enterprises, TemporaryUser, Users
from .form import NewUserForm
from gardens.models import Gardens
# Create your views here.
def login_user(request):

    if request.user.is_authenticated:
        try: 
            garden = Gardens.objects.filter(enterprise_id = request.user.enterprise_id).first()
            return redirect(f"/gardens/{garden.id}")
        except:
            return redirect("/dashboard")

    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            try: 
                garden = Gardens.objects.filter(enterprise_id = request.user.enterprise_id).first()
                return redirect(f"/gardens/{garden.id}")
            except:
                return redirect("/dashboard")
        else:
            messages.success(request, ("Nepareizs lietotājvārds un/vai parole!"))
            return redirect("/login")
    else:
        return render(request, 'login.html')

def logout_user(request):
    logout(request)
    messages.success(request, ("Visu labu!"))
    return redirect("/")

def register_user(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            messages.success(request, "Rēģistrācija izpildīta." )
            return redirect("/")
        messages.error(request, "Rēģistrācija neizdevās, mēģinat vēlreiz!")
    form = NewUserForm()
    return render (request, 'register.html')

def update_profile(request):
    user = request.user
    usersEnterprise = Enterprises.objects.get(pk = user.enterprise.id)

    if request.method == "POST":
        form = request.POST
        print(form)
        try:
            validate_email(form.get("email"))
            try:
                user.username = form.get("username")
                user.email = form.get("email")
                usersEnterprise.is_simulated = form.get("is_simulated")
                usersEnterprise.save()
                user.save()
                messages.error(request, "Jūsu izmaiņas tika saglabātas!")
            except:
                messages.error(request, "Jūsu Lietotājvārds nav atļauts, mēģinat vēlreiz!")
        except ValidationError as e:
            messages.error(request, "E-pasts nav pareizi uzrakstīts, mēģinat vēlreiz!")
        return redirect("/update_profile")

    context  = {
        'user': user,
        'usersEnterprise' : usersEnterprise
    }
    return render (request, 'edit_profile.html', context)

def change_password(request):
    user = request.user

    if request.method == "POST":
        form = request.POST
        if user.check_password(form.get("inputPasswordOld")):
            if form.get("inputPasswordNew") == form.get("inputPasswordNewVerify"):
                try:
                    validate_password(form.get("inputPasswordNew"), user=request.user)
                    user.set_password(form.get("inputPasswordNew"))
                    user.save()
                    messages.error(request, "Jūsu parole tika nomainīta!")
                    return redirect("/")
                except ValidationError as error:
                    for message in error.messages:
                        print(message)
                        if message == "This password is too short. It must contain at least 8 characters.":
                            messages.error(request, "Parolei jabūt vismaz 9 simboliem.")
                        elif message == "This password is too common.":
                            messages.error(request, "Parole ir pārāk izplatīta.")
                        elif message == "This password is entirely numeric.":
                            messages.error(request, "Parole nevar būt pilnībā skaitliska.")
                        elif message == "The password is too similar to the username.":
                            messages.error(request, "Parole ir pārāk līdzīga jūsu lietotājvārdam.")
                    return redirect("/change_password")
            else:
                messages.error(request, "Jūsu jaunas paroles lauki nesakrīt!")
                return redirect("/change_password")
        else:
            messages.error(request, "Veca parole nav pareiza, mēginat vēlreiz!")
            return redirect("/change_password")

    return render (request, 'new_password_form.html')

def register_with_code(request, register_code):
    temporary_user = TemporaryUser.objects.get(code = register_code)
    if request.method == "POST":
        form = request.POST
        email = temporary_user.email
        username = form.get("username").strip()
        password1 = form.get("password1").strip()
        password2 = form.get("password2").strip()
        enterprise = temporary_user.enterprise
        if password1 != password2:
            messages.error(request, "Paroles nesakrīt, mēģinat vēlreiz!")
            return redirect("/register")
        try:
            validate_email(email)
            try:
                validate_password(password1)
                try:
                    user = Users.objects.create_user(email, username, password1, enterprise.id)
                    user.save()
                    login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                    temporary_user.delete()
                    messages.success(request, "Reģistrācija veiksmīga!")
                    return redirect("/")
                except ValidationError as e:
                    messages.error(request, "Lietotājvārds jau ir aizņemts, mēģinat vēlreiz!")
            except ValidationError as e:
                messages.error(request, "Parole neatbilst prasībām, mēģinat vēlreiz!")
        except ValidationError as e:
            messages.error(request, "E-pasts nav pareizi uzrakstīts, mēģinat vēlreiz!")
    return render (request, 'register_work.html')

