from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from presiding.models import Post, UserProfile, CandidateProfile, CandidatePost, Voter, Vote
from django.contrib import messages
import random
from django.conf import settings
from django.core.mail import send_mail
from django.contrib.auth.decorators import login_required
from django.views.decorators.cache import cache_control


def home(request):
    page="home"

    if request.method == 'POST':
        username = request.POST.get('voter_email')
        password = request.POST.get('voter_password')

        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            userid = User.objects.filter(username=username).values_list('id')[:1].get()
            userid = userid[0]
            return redirect('list', voterid = userid)
        else:
            messages.error(request, 'Email/token number is incorrect or does not exist.')


    context = {'page': page}
    return render(request, 'home.html', context)


def generate_token(request):
    page="token"

    if request.method == 'POST':
        email = request.POST.get('voter_email')
        roll_number = request.POST.get('roll_number')

        user_profile = UserProfile.objects.filter(roll_number=roll_number)
        
        if user_profile.exists(): 
            if user_profile[0].voter_vote_flag == 0:
                chars = 'CDHKPQRVXY'
                nums =  '123456789'
                total = 8

                for i in range(total):
                    selects = random.sample(chars, 4) + random.sample(nums, 4)
                    unique_code = ''.join(selects)

                user_single_data = User.objects.get(username=email)
                user_single_data.set_password(unique_code)
                user_single_data.save()

                subject = 'NITM Alumni Election 2025 | Token Number'
                message = f'Dear Alumni, the token number is '+unique_code+'. Please, do not share this token number with anyone. Token Number is valid for one time voting only. This mail is system generated. Do not reply to this mail.'
                email_from = settings.EMAIL_HOST_USER
                recipient_list = [email, ]
                send_mail( subject, message, email_from, recipient_list )

                messages.success(request, 'Token Generated for : '+email+'. Generated Token Number has been sent to your email. Kindly, check spam folder in case you do not receive mail in your inbox.')
            else:
                messages.error(request, 'You have already voted.')
        else:
            chars = 'CDHKPQRVXY'
            nums =  '123456789'
            total = 8

            for i in range(total):
                selects = random.sample(chars, 4) + random.sample(nums, 4)
                unique_code = ''.join(selects)

            User.objects.create(
                username = email,
                email = email,
                password = unique_code
            )

            user_single_data = User.objects.get(username=email)
            user_single_data.set_password(unique_code)
            user_single_data.save()

            userID = user_single_data.id

            UserProfile.objects.create(
                is_voter = 1,
                voter_vote_flag = 0,
                user_id = userID,
                is_superuser = 0,
                roll_number = roll_number
            )

            subject = 'NITM Alumni Election 2025 | Token Number'
            message = f'Dear Alumni, the token number is '+unique_code+'. Please, do not share this token number with anyone. Token Number is valid for one time voting only. This mail is system generated. Do not reply to this mail.'
            email_from = settings.EMAIL_HOST_USER
            recipient_list = [email, ]
            send_mail( subject, message, email_from, recipient_list )

            messages.success(request, 'Token Generated for : '+email+'. Generated Token Number has been sent to your email. Kindly, check spam folder in case you do not receive mail in your inbox.')
            
    
    context = {'page': page}
    return render(request, 'generate_token.html', context)


# def generate_token(request):
#     page="token"

#     if request.method == 'POST':
#         email = request.POST.get('voter_email')
#         if User.objects.filter(username=email).exists():
#             userid = User.objects.filter(username=email).values_list('id')[:1].get()
#             userid = userid[0]
#             if UserProfile.objects.filter(user_id=userid,voter_vote_flag=False).exists():
#                 chars = 'CDHKPQRVXY'
#                 nums =  '123456789'
#                 total = 8

#                 for i in range(total):
#                     selects = random.sample(chars, 4) + random.sample(nums, 4)
#                     unique_code = ''.join(selects)

#                 user_single_data = User.objects.get(username=email)
#                 user_single_data.set_password(unique_code)
#                 user_single_data.save()

#                 subject = 'NITM Alumni Election 2023 | Token Number'
#                 message = f'Dear Alumni, the token number is '+unique_code+'. Please, do not share this token number with anyone. Token Number is valid for one time voting only. This mail is system generated. Do not reply to this mail.'
#                 email_from = settings.EMAIL_HOST_USER
#                 recipient_list = [email, ]
#                 send_mail( subject, message, email_from, recipient_list )

#                 messages.success(request, 'Token Generated for : '+email+'. Generated Token Number has been sent to your email. Kindly, check spam folder in case you do not receive mail in your inbox.')
#             else:
#                 messages.error(request, 'You have already voted.')
#         else:
#             messages.error(request, 'Email is not valid and is not registered as NITM Alumni.')
    
#     context = {'page': page}
#     return render(request, 'generate_token.html', context)


@login_required(login_url='home')
def list(request, voterid):
    page="list"

    if request.user.is_authenticated:
        pass
    else:
        messages.error(request, 'You have not logged in.')
        return redirect('home')

    if User.objects.filter(id=voterid).exists():
        if UserProfile.objects.filter(user_id=voterid, voter_vote_flag=False).exists():
            post_data = Post.objects.all()
            candidate_post_data = CandidatePost.objects.all()
            l_post_data = len(post_data)

            if request.method == 'POST':
                if UserProfile.objects.filter(id=voterid, voter_vote_flag=True):
                    messages.error(request, 'You have already voted.')
                    return redirect('home')
                
            loop_counter = 1
            for x in range(len(post_data)):
                if request.method == 'POST':
                    if CandidatePost.objects.filter(id=request.POST.get('candidate'+str(loop_counter))).exists():
                        Vote.objects.create(
                            candidate_post = CandidatePost.objects.get(id=request.POST.get('candidate'+str(loop_counter))),
                            voter = User.objects.get(id=voterid),
                        )
                    update_token_number = UserProfile.objects.get(user_id=voterid)
                    update_token_number.voter_vote_flag = True
                    update_token_number.save()
                    loop_counter = loop_counter + 1
                    if int(loop_counter) > len(post_data):
                        logout(request)
                        return redirect('thankyou')
        else:
            logout(request)
            messages.error(request, 'You have already voted!')
            context = {'page': page}
            return redirect('home')
        
        context = {'page': page, 'post_data': post_data,'candidate_post_data': candidate_post_data, 'voterid': voterid, 'l_post_data': l_post_data}
        return render(request, 'voter/list.html', context)
    
    else:
        logout(request)
        messages.error(request, 'Unauthorized access detected!')
        context = {'page': page}
        return redirect('home')


def thankyou(request):
    page="thankyou"
    context = {'page': page}
    return render(request, 'voter/thankyou.html', context)


@cache_control(no_cache=True, must_revalidate=True, no_store=True)
@login_required(login_url='home')
def voter_logout(request):
    logout(request)
    messages.error(request, 'You are logged out')
    return redirect('home')