from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from presiding.models import Voter
import random
from django.views.decorators.cache import cache_control
from django.http import HttpResponseRedirect


def presiding_login(request):
    page="presiding_login"

    if request.user.is_authenticated:
        return redirect('generate_token')

    if request.method == 'POST':
        username = request.POST.get('username').lower().replace(" ", "").strip()
        password = request.POST.get('password')

        try:
            user = User.objects.get(username=username)
        except:
            messages.error(request, 'User does not exist')

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

        if user is not None:
            login(request, user)
            if request.user.userprofile.is_presiding == True:
                messages.success(request, 'Logged in as Presiding Officer') 
                return redirect('generate_token')
            else:
                logout(request)
                messages.error(request, 'You are not authorized')
                return redirect('presiding_login')
        else:
            messages.error(request, 'Username OR password does not exit')


    context = {'page': page}
    return render(request, 'presiding/login.html', context)


@login_required(login_url='presiding_login')
def generate_token(request, rl="", uc=""):
    page="token"

    if request.method == 'POST':
        chars = 'CDHKPQRVXY'
        nums =  '123456789'
        total = 4

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

        first = request.POST.get('first').upper().strip()
        second = request.POST.get('second').upper().strip()
        third = request.POST.get('third').upper().strip()
        fourth = request.POST.get('fourth').upper().strip()
        fifth = request.POST.get('fifth').upper().strip()
        sixth = request.POST.get('sixth').upper().strip()
        seventh = request.POST.get('seventh').upper().strip()
        eighth = request.POST.get('eighth').upper().strip()
        roll_number = str(first) + str(second) + str(third) + str(fourth) + str(fifth) + str(sixth) + str(seventh) + str(eighth)
        roll_number = roll_number.replace(",", "")
        roll_number = roll_number.replace("(", "")
        roll_number = roll_number.replace(")", "")
        roll_number = roll_number.replace("'", "")
        
        if Voter.objects.filter(voter_roll_number=roll_number):
            messages.error(request, 'Roll Number is already registered.')
            context = {'page': page, 'rl': "", 'uc': ""}
            return render(request, 'presiding/token.html', context)
        

        if Voter.objects.filter(voter_token_number=unique_code):
            messages.error(request, 'Token Number is not generated. Please try again.')
            context = {'page': page, 'rl': roll_number, 'uc': ""}
            return render(request, 'presiding/token.html', context)
        
        
        Voter.objects.create(
            voter_roll_number = roll_number,
            voter_token_number = unique_code,
            voter_token_flag = False,
        )
        messages.success(request, 'Token Generated for : '+roll_number)
        context = {'page': page, 'rl': roll_number, 'uc': unique_code}
        return render(request, 'presiding/token.html', context)


    context = {'page': page, 'rl': rl, 'uc': uc}
    return render(request, 'presiding/token.html', context)


@cache_control(no_cache=True, must_revalidate=True, no_store=True)
@login_required(login_url='presiding_login')
def presiding_logout(request):
    logout(request)
    messages.error(request, 'You are logged out')
    return HttpResponseRedirect('presiding-officer-login')

