from django.shortcuts import render

# Create your views here.
from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth.decorators import login_required
from django.urls import reverse, reverse_lazy
from .models import Person
from .filters import StaffFilter, StudentFilter
from management.filters import TermFilter
from management.models import Session, Class, Subject, Term
from .forms import *
from django.contrib import messages
from django.core.paginator import Paginator
from django.db.models import Q
from django.contrib.auth import update_session_auth_hash

@login_required
def create(request):
    if request.user.role == "Admin":
        if request.method == "POST":
            form = CustomRegisterForm(request.POST, request.FILES)
            if form.is_valid():
                form.save()
                messages.success(request, "Registration was successful!")
                return redirect('account')
            else:
                messages.error(request, "Please review and correct form input fields")
                #return redirect('account')
        else:
            form = CustomRegisterForm()
        return render(request, 'account/account.html', {'form': form})
    else:
        return redirect('index')


@login_required
def showAdminBoard(request):
    if request.user.role == "Admin":
        students = Person.objects.filter(role="Student").count()
        staff = Person.objects.filter(role="Staff").count()
        people = students + staff

        term = Term.objects.get(current=True)
        p_studs = 0
        for each in term.paid_school.all():
            p_studs += 1

        o_studs = students - p_studs


        # p_studs = First.objects.filter(session=session, value=1, school_fees=True).count()
        # o_studs = First.objects.filter(session=session, value=1, school_fees=False).count()
        classes = Class.objects.all().count()
        subjects = Subject.objects.all().count()

        context = {'students':students, 'people':people, 'staff':staff,
                    'classes':classes, 'subjects':subjects, 'p_studs':p_studs, 'o_studs':o_studs}
        return render(request, 'account/admin_board.html', context)
    else:
        return redirect('index')

@login_required
def showStaffBoard(request):
    if request.user.role == "Staff":
        subjects = Subject.objects.filter(teacher=request.user).count()
        classes = Class.objects.filter(teacher=request.user).count()
        studs = Person.objects.filter(role="Student", classe__teacher=request.user).count()

        context = {'subjects':subjects, 'classes':classes, 'studs':studs}
        return render(request, 'account/staff_board.html', context)
    else:
        return redirect('index')

@login_required
def showBursarBoard(request):
    if request.user.role == "Bursar":
        subjects = Subject.objects.filter(teacher=request.user).count()
        classes = Class.objects.filter(teacher=request.user).count()
        studs = Person.objects.filter(role="Student", classe__teacher=request.user).count()

        context = {'subjects':subjects, 'classes':classes, 'studs':studs}
        return render(request, 'account/bursar_board.html', context)
    else:
        return redirect('index')

@login_required
def showStudentBoard(request):
    if request.user.role == "Student":
        me = Person.objects.get(username=request.user.username)
        classe = me.classe
        teacher = classe.teacher.first_name + " " + classe.teacher.last_name

        studs = Person.objects.filter(role="Student", classe=classe).count()
        context = {'classe':classe, 'teacher':teacher, 'studs':studs}
        return render(request, 'account/student_board.html', context)
    else:
        return redirect('index')

@login_required
def showAdminProfile(request, **kwargs):
    if request.user.role == "Admin":
        if request.method == "POST":
            form = CustomRegisterFormAdmin(request.POST, request.FILES, instance=request.user)
            if form.is_valid():
                form.save()
                reg = Person.objects.get(username=request.user.username)
                reg.is_updated = True
                reg.save()
                messages.success(request, "Your profile has been modified successfully")
                return redirect('admin_profile')
            else:
                messages.error(request, "Error: Please review form input fields below")
        else:
            form = CustomRegisterFormAdmin(instance=request.user)
        return render(request, 'account/profile_admin.html', {'form': form})
    else:
        return redirect('index')

def updateAdminStaff(request, id):
    if request.user.role == "Admin":
        member = Person.objects.get(id=id)
        form = CustomRegisterFormStaff(instance=member)
        if request.method=='POST':
            form = CustomRegisterFormStaff(request.POST, request.FILES, instance=member)
            if form.is_valid():
                form.save()
                messages.success(request, "The staff member has been modified successfully")
                return redirect('admin_staff')
        return render(request, 'account/admin_staff_update.html', {'form': form, 'member': member})
    else:
        return redirect('index')

def updateAdminStudents(request, id):
    if request.user.role == "Admin":
        member = Person.objects.get(id=id)
        form = CustomRegisterFormStud(instance=member)
        if request.method=='POST':
            form = CustomRegisterFormStud(request.POST, request.FILES, instance=member)
            if form.is_valid():
                form.save()
                messages.success(request, "The student has been modified successfully")
                return redirect('admin_students')
        return render(request, 'account/admin_students_update.html', {'form': form, 'member': member})
    else:
        return redirect('index')

@login_required
def showStaffProfile(request, **kwargs):
    if request.user.role == "Staff":
        if request.method == "POST":
            form = CustomRegisterFormStaff(request.POST, request.FILES, instance=request.user)
            if form.is_valid():
                form.save()
                reg = Person.objects.get(username=request.user.username)
                reg.is_updated = True
                reg.save()
                messages.success(request, "Your profile has been modified successfully")

                return redirect('staff_profile')
            else:
                messages.error(request, "Error: Please review form input fields below")
        else:
            form = CustomRegisterFormAdmin(instance=request.user)
        return render(request, 'account/profile_staff.html', {'form': form})
    else:
        return redirect('index')

@login_required
def showBursarProfile(request, **kwargs):
    if request.user.role == "Bursar":
        if request.method == "POST":
            form = CustomRegisterFormStaff(request.POST, request.FILES, instance=request.user)
            if form.is_valid():
                form.save()
                reg = Person.objects.get(username=request.user.username)
                reg.is_updated = True
                reg.save()
                messages.success(request, "Your profile has been modified successfully")

                return redirect('bursar_profile')
            else:
                messages.error(request, "Error: Please review form input fields below")
        else:
            form = CustomRegisterFormAdmin(instance=request.user)
        return render(request, 'account/profile_bursar.html', {'form': form})
    else:
        return redirect('index')

@login_required
def showStudentProfile(request, **kwargs):
    if request.user.role == "Student":
        if request.method == "POST":
            form = CustomRegisterFormStudent(request.POST, request.FILES, instance=request.user)
            if form.is_valid():
                form.save()
                reg = Person.objects.get(username=request.user.username)
                reg.is_updated = True
                reg.save()
                messages.success(request, "Your profile has been modified successfully")

                return redirect('student_profile')
            else:
                messages.error(request, "Error: Please review form input fields below")
        else:
            form = CustomRegisterFormStudent(instance=request.user)
        return render(request, 'account/profile_student.html', {'form': form})
    else:
        return redirect('index')

@login_required
def showAdminStaff(request):
    if request.user.role == "Admin":
        context = {}
        filtered_staff = StaffFilter(
            request.GET,
            queryset = Person.objects.filter(role="Staff").order_by('username')
        )
        context['filtered_staff'] = filtered_staff
        paginated_filtered_staff = Paginator(filtered_staff.qs, 25)
        page_number = request.GET.get('page')
        staff_page_obj = paginated_filtered_staff.get_page(page_number)
        context['staff_page_obj'] = staff_page_obj
        total_staff = filtered_staff.qs.count()
        context['total_staff'] = total_staff
        # courses = Course.objects.all()
        # context['courses'] = courses
        return render(request, 'account/admin_staff.html', context=context)
    else:
        return redirect('index')

@login_required
def adminChangePassword(request):
    if request.user.role == "Admin":
        if request.method == "POST":
            form = CustomPasswordChangeForm(data=request.POST, user=request.user)
            if form.is_valid():
                form.save()
                update_session_auth_hash(request, form.user)
                messages.success(request, "Your password has been changed successfully")
                return redirect('admin_profile')
        else:
            form = CustomPasswordChangeForm(user=request.user)

        return render(request, 'account/admin_change_password.html', {'form': form})
    else:
        return redirect('index')

@login_required
def staffChangePassword(request):
    if request.user.role == "Staff":
        if request.method == "POST":
            form = CustomPasswordChangeForm(data=request.POST, user=request.user)
            if form.is_valid():
                form.save()
                update_session_auth_hash(request, form.user)
                messages.success(request, "Your password has been changed successfully")
                return redirect('staff_profile')
        else:
            form = CustomPasswordChangeForm(user=request.user)

        return render(request, 'account/staff_change_password.html', {'form': form})
    else:
        return redirect('index')

@login_required
def bursarChangePassword(request):
    if request.user.role == "Staff":
        if request.method == "POST":
            form = CustomPasswordChangeForm(data=request.POST, user=request.user)
            if form.is_valid():
                form.save()
                update_session_auth_hash(request, form.user)
                messages.success(request, "Your password has been changed successfully")
                return redirect('bursar_profile')
        else:
            form = CustomPasswordChangeForm(user=request.user)

        return render(request, 'account/bursar_change_password.html', {'form': form})
    else:
        return redirect('index')


@login_required
def studentChangePassword(request):
    if request.user.role == "Student":
        if request.method == "POST":
            form = CustomPasswordChangeForm(data=request.POST, user=request.user)
            if form.is_valid():
                form.save()
                update_session_auth_hash(request, form.user)
                messages.success(request, "Your password has been changed successfully")
                return redirect('student_profile')
        else:
            form = CustomPasswordChangeForm(user=request.user)

        return render(request, 'account/student_change_password.html', {'form': form})
    else:
        return redirect('index')

@login_required
def showAdminStudents(request):
    if request.user.role == "Admin":
        context = {}
        filtered_students = StudentFilter(
            request.GET,
            queryset = Person.objects.filter(role="Student").order_by('username')
        )
        context['filtered_students'] = filtered_students
        paginated_filtered_students = Paginator(filtered_students.qs, 25)
        page_number = request.GET.get('page')
        students_page_obj = paginated_filtered_students.get_page(page_number)
        context['students_page_obj'] = students_page_obj
        total_students = filtered_students.qs.count()
        context['total_students'] = total_students
        # courses = Course.objects.all()
        # context['courses'] = courses
        return render(request, 'account/admin_students.html', context=context)
    else:
        return redirect('index')

@login_required
def showPaidStudents(request):
    if request.user.role == "Admin":

        context = {}
        filtered_students = TermFilter(
            request.GET,
            queryset = Term.objects.all()
        )
        context['filtered_students'] = filtered_students
        paginated_filtered_students = Paginator(filtered_students.qs, 25)
        page_number = request.GET.get('page')
        students_page_obj = paginated_filtered_students.get_page(page_number)
        context['students_page_obj'] = students_page_obj
        total_students = filtered_students.qs.count()
        context['total_students'] = total_students

        return render(request, 'account/paid_students.html', context=context)
    else:
        return redirect('index')

@login_required
def showOwingStudents(request):
    if request.user.role == "Admin":

        context = {}
        filtered_students = TermFilter(
            request.GET,
            queryset = Term.objects.all()
        )
        context['filtered_students'] = filtered_students
        paginated_filtered_students = Paginator(filtered_students.qs, 25)
        page_number = request.GET.get('page')
        students_page_obj = paginated_filtered_students.get_page(page_number)
        context['students_page_obj'] = students_page_obj
        total_students = filtered_students.qs.count()
        context['total_students'] = total_students

        owing_data = {}

        for term in students_page_obj:
            paid_ids = term.paid_school.values_list('id', flat=True)
            unpaid_students = Person.objects.filter(
                role='Student'
            ).exclude(
                id__in=paid_ids
            ).distinct()

            owing_data[term] = unpaid_students

        context['owing_data'] = owing_data

        return render(request, 'account/owing_students.html', context=context)
    else:
        return redirect('index')

@login_required
def confirm(request, id, id2):
    if request.user.role == "Admin":
        term = Term.objects.get(id=id)
        student = Person.objects.get(id=id2)
        term.paid_school.add(student)
        messages.success(request, "Updated successfully")
        return redirect('owing_students')
    else:
        return redirect('index')

@login_required
def unConfirm(request, id, id2):
    if request.user.role == "Admin":
        term = Term.objects.get(id=id)
        student = Person.objects.get(id=id2)
        term.paid_school.remove(student)
        messages.success(request, "Updated successfully")
        return redirect('paid_students')
    else:
        return redirect('index')

@login_required
def loginTo(request):
    if request.user.role == "Admin":
        return HttpResponseRedirect(reverse('admin_board'))
    elif request.user.role == "Bursar":
        return HttpResponseRedirect(reverse('bursar_board'))
    elif request.user.role == "Staff":
        return HttpResponseRedirect(reverse('staff_board'))
    elif request.user.role == "Student":
        return HttpResponseRedirect(reverse('student_board'))
    # elif request.user.role == "A---n":
    #     return HttpResponseRedirect(reverse('admin_board_first'))
