from django.shortcuts import render,redirect, get_object_or_404
from . models import *
from . forms import *
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.auth.models import auth
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
from django.core.mail import send_mail 
from dateutil.parser import parse


def executive_list(request):

    return render(request,'Survey/list.html')

def super_admin_login(request):
    page = 'super_login'
    if request.user.is_superuser:
        return redirect('Survey:super_admin')

    if request.method == 'POST':
        username = request.POST.get('username')
        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)

        try:
            if user.is_superuser:
                login(request, user)
                return redirect('Survey:super_admin')
        except:
            return redirect('Survey:super_admin_login')
            messages.error(request,'Username or Password does not exist')

    context = {'page':page}

    return render(request,'Survey/super_admin_login.html',context)

def admin_login(request):
    page = 'login'
    if request.user.is_authenticated:
        return redirect('Survey:admin')

    if request.method == 'POST':
        username = request.POST.get('username')
        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)
            return redirect('Survey:admin')

        

        else:
            messages.error(request,'Username or Password does not exist')

    context = {'page':page}

    return render(request,'Survey/login.html',context)

def register(request):
    page = 'register'
    form = UserCreationForm()
    if request.method == 'POST':
        form = UserCreationForm(data=request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.username = user.username
            user.save()
            # login(request,user)
            return redirect('Survey:user_table')
        else:
            messages.error(request,'An error occured during registration')

    context = {'page':page, 'form':form}
    return render(request,'Survey/register.html',context)

def logoutUser(request):
    if request.user.is_superuser:
        logout(request)
        return redirect('Survey:super_admin_login')
    else:
        logout(request)
        return redirect('Survey:admin_login')

@login_required(login_url='Survey:admin_login')
def admin(request):
    # userss = request.user.annexsurvey 
    # user = User.objects.get(id=id)
    details = AnnexSurvey.objects.filter(owner=request.user)
    context = {'details':details}
    return render(request,'Survey/admin.html',context)

@login_required(login_url='Survey:admin_login')
def admin_edit(request, pk):
    detail = get_object_or_404(AnnexSurvey, pk=pk)
    data = Polling.objects.all()
    if request.method == "POST":
        detail.full_name = request.POST['full_name']
        detail.date = parse(request.POST['date'])
        detail.gender = request.POST['gender']
        detail.hometown = request.POST['hometown']
        detail.languages = request.POST['languages']
        detail.digital_address = request.POST['digital_address'] 
        detail.email = request.POST['email']
        detail.contact = request.POST['contact']
        detail.residential_address = request.POST['residential_address']
        detail.postal_address = request.POST['postal_address']
        detail.ghana_card = request.POST['ghana_card']
        detail.father_name = request.POST['father_name']
        detail.father_state = request.POST['father_state']
        detail.mother_name = request.POST['mother_name']
        detail.mother_state = request.POST['mother_state']
        detail.spouse_name = request.POST['spouse_name']
        detail.children = request.POST.get('children', 0)
        detail.education = request.POST['education']
        detail.marital_status = request.POST['marital_status']
        detail.religion = request.POST['religion']
        detail.employment = request.POST['employment']
        detail.own_business = request.POST['own_business']
        detail.business_nature = request.POST.get('business_nature', '')
        detail.business_name = request.POST.get('business_name', '')
        detail.career = request.POST['career']
        detail.electoral_area = request.POST['electoral_area']
        detail.polling_station = request.POST['polling_station']
        detail.admission_year = request.POST['admission_year']
        detail.voter_id = request.POST['voter_id']
        detail.party_membership = request.POST.get('party_membership', 'Yes')
        detail.recognized_member = request.POST['recognized_member']
        detail.voluntary_group = request.POST['voluntaryGroup']
        detail.position = request.POST.get('position', 'No')
        detail.polling_station_level_position = request.POST.get('pollingStationPosition', '')
        detail.constituency_position = request.POST.get('constPosition', '')
        detail.regional_position = request.POST['regionalPosition']
        detail.national_position = request.POST['nationalPosition']
        detail.any_disability = request.POST.get('any_disability', 'No')
        detail.health_insurance = request.POST.get('health_insurance', 'No')
        detail.health_insurance_number = request.POST['nhis_number']
        detail.date_issuance = request.POST['date_issuance']
        detail.save()
        return redirect("Survey:admin")
    context = {"detail":detail, "polling_station":data}
    return render(request,'Survey/edit.html',context)


@login_required(login_url='Survey:admin_login')
def admin_delete(request, pk):
    detail = get_object_or_404(AnnexSurvey, pk=pk)
    context = {'detail':detail}

    if request.method == "POST":
        detail.delete()
        return redirect("Survey:admin")
    return render(request,'Survey/delete.html',context)



@login_required(login_url='Survey:admin_login')
def super_admin(request):
    details = AnnexSurvey.objects.all()
    context = {'details':details}
    return render(request,'Survey/super_admin.html',context)


@login_required(login_url='Survey:admin_login')
def super_admin_delete(request, pk):
    detail = get_object_or_404(AnnexSurvey, pk=pk)
    context = {'detail':detail}

    if request.method == "POST":
        detail.delete()
        return redirect("Survey:super_admin")
    return render(request,'Survey/super_admin_delete.html',context)


@login_required(login_url='Survey:admin_login')
def user1(request):
    data = Polling.objects.all()
    users = Users.objects.all()
    main_user = ''
    if request.method == 'POST':
        Full_name = request.POST['Full_name']
        Email = request.POST['Email']
        Contact = request.POST['Contact']
        Polling_station = request.POST['Polling_station']

        password = User.objects.make_random_password()
        password = User.objects.make_random_password(length=7)
        # passwrod = User.objects.make_random_password(length=14, allowed_chars="abcdefghjkmnpqrstuvwxyz01234567889")
        # print(password)

        subject = "Welcome to the Annex Survey Website"
        message = 'Hello ' + Full_name + ', Your admin account on the Annex Survey Website has been created.\nPlese find below the login url and your credentials.\n\nURL: https://annexsurvey.npontu.com/admin-page/\n\
Email: ' + Email + '\nPassword: '+ password+ ' \n\n\nRole: Polling Station Executive'
        
        from_email = settings.EMAIL_HOST_USER
        recipient_list = [Email]

        if User.objects.filter(username=Email).exists():
            messages.info(request, 'Come on, Email was already Taken !')
            return redirect('Survey:user1')
        else:
            main_user = User.objects.create_user(username=Email,password=password)
            users = Users.objects.create(host=request.user,Full_name=Full_name,Email=Email,Contact=Contact,Polling_station=Polling_station)
            send_mail(subject,message,from_email,recipient_list,fail_silently=False)
            return redirect('Survey:user_table')
            
    context = {'users':users,'main_user':main_user,'polling_station':data}
    return render(request,'Survey/user_setup.html',context)



@login_required(login_url='Survey:admin_login')
def user_table(request):
    details = Users.objects.all()
    context = {'details':details}
    return render(request,'Survey/user_table.html',context)

@login_required(login_url='Survey:admin_login')
def user_entries(request, pk):
    user = Users.objects.filter(pk=pk)
    user_name = user[0].Full_name
    details = AnnexSurvey.objects.filter(owner=user[0].id)
    context = {'details':details, 'user':user_name}
    return render(request,'Survey/user_entries.html',context)

def annex_form(request):
    data = Polling.objects.all()
    annexsurvey = AnnexSurvey.objects.all()
    
    if request.method == 'POST':
        full_name = request.POST['full_name']
        date = request.POST['date']
        gender = request.POST['gender']
        hometown = request.POST['hometown']
        languages = request.POST['languages']
        digital_address = request.POST['digital_address'] 
        email = request.POST['email']
        contact = request.POST['contact']
        residential_address = request.POST['residential_address']
        postal_address = request.POST['postal_address']
        ghana_card = request.POST['ghana_card']
        father_name = request.POST['father_name']
        father_state = request.POST['father_state']
        mother_name = request.POST['mother_name']
        mother_state = request.POST['mother_state']
        spouse_name = request.POST['spouse_name']
        children = request.POST.get('children', 0)
        education = request.POST['education']
        marital_status = request.POST['marital_status']
        religion = request.POST['religion']
        employment = request.POST['employment']
        own_business = request.POST['own_business']
        business_nature = request.POST.get('business_nature', '')
        business_name = request.POST.get('business_name', '')
        career = request.POST['career']
        electoral_area = request.POST['electoral_area']
        polling_station = request.POST['polling_station']
        admission_year = request.POST['admission_year']
        voter_id = request.POST['voter_id']
        party_membership = request.POST.get('party_membership', 'Yes')
        recognized_member = request.POST['recognized_member']
        voluntary_group = request.POST['voluntaryGroup']
        position = request.POST.get('position', 'No')
        polling_station_position = request.POST.get('pollingStationPosition', '')
        const_position = request.POST.get('constPosition', '')
        regional_position = request.POST['regionalPosition']
        national_position = request.POST['nationalPosition']
        any_disability = request.POST.get('any_disability', 'No')
        health_insurance = request.POST.get('health_insurance', 'No')
        nhis_number = request.POST['nhis_number']
        date_issuance = request.POST['date_issuance']
        if request.user.is_anonymous:
            annexsurvey = AnnexSurvey.objects.create(owner=None,full_name=full_name,date=date,gender=gender,hometown=hometown,languages=languages,
            digital_address=digital_address,email=email,contact=contact,residential_address=residential_address,postal_address=postal_address,
            ghana_card=ghana_card,father_name=father_name,father_state=father_state,mother_name=mother_name,mother_state=mother_state,
            spouse_name=spouse_name,children=children,education=education,marital_status=marital_status,religion=religion,employment=employment,
            own_business= own_business, business_nature= business_nature,business_name=business_name,career=career,electoral_area=electoral_area,
            polling_station=polling_station,admission_year=admission_year,voter_id=voter_id,party_membership=party_membership,
            recognized_member=recognized_member,position=position,any_disability=any_disability,health_insurance=health_insurance,date_issuance=date_issuance,
            voluntary_group=voluntary_group, polling_station_level_position=polling_station_position, constituency_position=const_position,
            regional_position=regional_position, national_position=national_position, health_insurance_number=nhis_number)
            # annexsurvey = AnnexSurvey.objects.create(owner=None,full_name=full_name,date=date,gender=gender,hometown=hometown,languages=languages,
            # digital_address=digital_address,email=email,contact=contact,residential_address=residential_address,postal_address=postal_address,
            # ghana_card=ghana_card,father_name=father_name,father_state=father_state,mother_name=mother_name,mother_state=mother_state,
            # spouse_name=spouse_name,children=children,education=education,marital_status=marital_status,religion=religion,employment=employment,
            # own_business= own_business, business_nature= business_nature,business_name=business_name,career=career,electoral_area=electoral_area,
            # polling_station=polling_station,admission_year=admission_year,voter_id=voter_id,party_membership=party_membership,
            # recognized_member=recognized_member,position=position,any_disability=any_disability,health_insurance=health_insurance,date_issuance=date_issuance)
        else:
            annexsurvey = AnnexSurvey.objects.create(owner=request.user,full_name=full_name,date=date,gender=gender,hometown=hometown,languages=languages,
            digital_address=digital_address,email=email,contact=contact,residential_address=residential_address,postal_address=postal_address,
            ghana_card=ghana_card,father_name=father_name,father_state=father_state,mother_name=mother_name,mother_state=mother_state,
            spouse_name=spouse_name,children=children,education=education,marital_status=marital_status,religion=religion,employment=employment,
            own_business= own_business, business_nature= business_nature,business_name=business_name,career=career,electoral_area=electoral_area,
            polling_station=polling_station,admission_year=admission_year,voter_id=voter_id,party_membership=party_membership,
            recognized_member=recognized_member,position=position,any_disability=any_disability,health_insurance=health_insurance,date_issuance=date_issuance,
            voluntary_group=voluntary_group, polling_station_level_position=polling_station_position, constituency_position=const_position,
            regional_position=regional_position, national_position=national_position, health_insurance_number=nhis_number)
            # annexsurvey = AnnexSurvey.objects.create(owner=request.user,full_name=full_name,date=date,gender=gender,hometown=hometown,languages=languages,
            # digital_address=digital_address,email=email,contact=contact,residential_address=residential_address,postal_address=postal_address,
            # ghana_card=ghana_card,father_name=father_name,father_state=father_state,mother_name=mother_name,mother_state=mother_state,
            # spouse_name=spouse_name,children=children,education=education,marital_status=marital_status,religion=religion,employment=employment,
            # own_business= own_business, business_nature= business_nature,business_name=business_name,career=career,electoral_area=electoral_area,
            # polling_station=polling_station,admission_year=admission_year,voter_id=voter_id,party_membership=party_membership,
            # recognized_member=recognized_member,position=position,any_disability=any_disability,health_insurance=health_insurance,date_issuance=date_issuance)
            return redirect('Survey:admin')
    # user = request.user.annexsurvey    
    context = {'annexsurvey':annexsurvey,'polling_station':data}
    return render(request,'Survey/Annex_form.html', context)
