from django.contrib.auth import login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.http import HttpResponse
from django.shortcuts import redirect, render
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes, force_str
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.contrib import messages
import random
import threading

from orders.views import user_orders

from .forms import RegistrationForm, UserEditForm
from .models import UserBase
from .tokens import account_activation_token


@login_required
def dashboard(request):
    orders = user_orders(request)
    return render(request,
                  'account/user/dashboard.html',
                  {'section': 'profile', 'orders': orders})


@login_required
def edit_details(request):
    if request.method == 'POST':
        user_form = UserEditForm(instance=request.user, data=request.POST)

        if user_form.is_valid():
            user_form.save()
            return redirect('account:dashboard')
    else:
        user_form = UserEditForm(instance=request.user)

    return render(request,
                  'account/user/edit_details.html', {'user_form': user_form})


@login_required
def delete_user(request):
    user = UserBase.objects.get(user_name=request.user)
    user.is_active = False
    user.save()
    logout(request)
    return redirect('account:delete_confirmation')


def account_register(request):
    error_message = None
    num1=0
    num2=0
    
    registerForm = RegistrationForm()
    
    if request.user.is_authenticated:
        return redirect('account:dashboard')
        
    if request.method == 'POST':
        registerForm = RegistrationForm(request.POST)
        if registerForm.is_valid():
            user = registerForm.save(commit=False)
            user.email = registerForm.cleaned_data['email']
            user.set_password(registerForm.cleaned_data['password'])
            user.is_active = False
            user.phone_number = registerForm.cleaned_data['phone_number']
            
            # Проверка правильного ответа
            user_answer = request.POST.get('user_answer')
            num1 = request.POST.get('num1')
            num2 = request.POST.get('num2')
            try:
                user_answer = int(user_answer)
                num1 = int(num1)
                num2 = int(num2)
                correct_answer = num1 + num2
                
                if user_answer == correct_answer:
                    user.save()
                    current_site = get_current_site(request)
                    subject = 'Активируйте свой аккаунт, письмо на почте'
                    message = render_to_string('account/registration/account_activation_email.html', {
                        'user': user,
                        'domain': current_site.domain,
                        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                        'token': account_activation_token.make_token(user),
                    })
                    user.email_user(subject=subject, message=message)
                    return HttpResponse('Регистрация прошла успешно, а на почту выслана активация. Зайдите на почту и активируйте аккаунт')
                else:
                    error_message = 'Ответ не верный. Пожалуйста попробуйте ещё раз.'
            except ValueError:
                error_message = 'Пожалуйста, введите корректное целое число.'
                return render(request, 'account/registration/register.html', {'form': registerForm, 'error_message': error_message})
        else:
            error_message = 'Пожалуйста, исправьте ошибки в форме.'
    else:
        # Generate random numbers for the task
        num1 = random.randint(1, 100)
        num2 = random.randint(1, 100)


    
    # Передайте num1 и num2 в контекст шаблона
    return render(request, 'account/registration/register.html', {'form': registerForm, 'num1': num1, 'num2': num2, 'error_message': error_message})


def account_activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = UserBase.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, user.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        login(request, user)
        
        
        return redirect('account:dashboard')
    else:
        return render(request, 'account/registration/activation_invalid.html')