# from rest_framework import viewsets
# from rest_framework.decorators import action
# from rest_framework.response import Response
# from .models import CorporateMember, CorporateUser, Transaction, CreditRequest, Payment, CreditRequestFromMember, Institute, AffiliatedStudent, UnaffiliatedStudent, WaitForInstituteStudent, CreditRequestStudent, CreditRequestInstitute
# from .serializers import (
#     CorporateMemberSerializer, CorporateUserSerializer, TransactionSerializer,
#     CreditRequestSerializer, PaymentSerializer, CreditRequestMemberSerializer,
#     InstituteSerializer, AffiliatedStudentSerializer, UnaffiliatedStudentSerializer, WaitForInstituteStudentSerializer,CreditRequestInstituteSerializer, CreditRequestStudentSerializer
# )
# from django.http import HttpResponse
# from django.shortcuts import render
# from django.views import View
# from django.contrib.auth.models import User
# from django.conf import settings
# from datetime import datetime, timedelta
# from django.shortcuts import get_object_or_404
# from django.http import JsonResponse
# from django.db import transaction as db_transaction
# from django.db.models import Sum, Q
# from django.db import transaction
# from auto_email.views import sendmail 
# from reportlab.lib.pagesizes import letter
# from reportlab.lib import colors
# from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
# from reportlab.lib.styles import getSampleStyleSheet
# from reportlab.lib.units import inch
# import json
# from django.utils import timezone
# DISCOUNT = settings.IM_DISCOUNT
# from MNF.settings import discount_limit_handler

from django.shortcuts import redirect
class CorporateReg(View):
    def get(self, request, *args, **kwargs):
        user = request.user
        if CorporateMember.objects.filter(user=user).exists(): 
            return redirect('/institute/')
            
        elif CorporateUser.objects.filter(user= user).exists():
            return redirect('/institute/')
            
            return render(request, "institutional/intermidiate.html", context)
        elif Institute.objects.filter(user= user).exists() or AffiliatedStudent.objects.filter(user= user).exists() or UnaffiliatedStudent.objects.filter(user= user).exists() or WaitForInstituteStudent.objects.filter(user= user).exists():
            message = "You have already taken other type of membership so you can not take this membership!!"
            context = {
                'message': message,
            }
            return render(request, "institutional/intermidiate.html", context)
        else:
            key = settings.COUNTRY_KEY
            context = {
                'key': key,
            }
            return render(request, "institutional/corporateReg.html", context)
    
class InstituteReg(View):
    def get(self, request, *args, **kwargs):
        user = request.user
        if Institute.objects.filter(user= user).exists(): 
            return redirect('/institute/')
        elif AffiliatedStudent.objects.filter(user= user).exists():
            return redirect('/institute/')
        elif CorporateMember.objects.filter(user=user).exists() or CorporateUser.objects.filter(user= user).exists() or UnaffiliatedStudent.objects.filter(user= user).exists() or WaitForInstituteStudent.objects.filter(user= user).exists():
            message = "You have already taken other type of membership so you can not take this membership!!"
            context = {
                'message': message,
            }
            return render(request, "institutional/intermidiate.html", context)
        else:
            key = settings.COUNTRY_KEY
            context = {
                'key': key,
            }
            return render(request, "institutional/instituteReg.html", context)

class StudentReg(View):
    def get(self, request, *args, **kwargs):
        user = request.user
        if WaitForInstituteStudent.objects.filter(user= user).exists(): 
            return redirect('/institute/')
        elif UnaffiliatedStudent.objects.filter(user= user).exists():
            return redirect('/institute/')
        elif CorporateMember.objects.filter(user=user).exists() or CorporateUser.objects.filter(user= user).exists() or AffiliatedStudent.objects.filter(user= user).exists() or Institute.objects.filter(user= user).exists():
            message = "You have already taken other type of membership so you can not take this membership!!"
            context = {
                'message': message,
            }
            return render(request, "institutional/intermidiate.html", context)
        else:
            key = settings.COUNTRY_KEY
            institutes = Institute.objects.all()
            context = {
                'key': key,
                'institutes': institutes,
            }
            return render(request, "institutional/studentReg.html", context)

class AffliliatedStudentReg(View):
    def get(self, request, *args, **kwargs):
        key = settings.COUNTRY_KEY
        institutes = Institute.objects.all()
        context = {
            'key': key,
            'institutes': institutes,
        }
        return render(request, "institutional/affstudentReg.html", context)

class Main(View):
    def get(self, request, *args, **kwargs):
        user = request.user
        total_payable_of_users_this_month = total_payable_of_users_last_month = total_payable_of_students_last_month = total_payable_of_students_this_month = 0.0
        credit_requests = CreditRequestFromMember.objects.filter(ctype="corporate_membership")
        credit_requests_institute = CreditRequestInstitute.objects.filter(ctype="institute_membership")
        if user.is_superuser:
            context ={
                'credit_requests': credit_requests,
                'credit_requests_institute': credit_requests_institute,
            }
            return render(request, 'institutional/AdminDashboard.html', context)
        
        if CorporateMember.objects.filter(user=user).exists() or CorporateUser.objects.filter(user= user).exists() or Institute.objects.filter(user= user).exists() or AffiliatedStudent.objects.filter(user= user).exists() or UnaffiliatedStudent.objects.filter(user= user).exists() or WaitForInstituteStudent.objects.filter(user= user).exists():
            if CorporateMember.objects.filter(user=user).exists():
                print("Phase-1")
                if CorporateMember.objects.filter(user= user, is_approved="pending").exists():
                    print("Phase-2")
                    return render(request, 'institutional/application_under_review.html')
                elif CorporateMember.objects.filter(user= user, is_approved="approved").exists():
                    userdetails = CorporateMember.objects.get(user= user, is_approved="approved")
                    associated_corporate_users = CorporateUser.objects.filter(this_user_admin=userdetails)
                    for auser in associated_corporate_users:
                        total_payable_of_users_this_month += float(auser.used_credit_point) 
                    for auser in associated_corporate_users:
                        total_payable_of_users_last_month += float(auser.pending_payment)
                    total_payable_of_member_last_month = float(userdetails.pending_payment)
                    total_payable_of_member_this_month = float(userdetails.used_credit_point)
                    input_dt = datetime.now()
                    next_month = input_dt.replace(day=28) + timedelta(days=4)
                    print("Phase-3")    
                    validity_time = next_month - timedelta(days=next_month.day)
                    credit_requests = CreditRequest.objects.filter(request_to=userdetails)
                    total_payable = 0.0
                    total_payable += float(userdetails.used_credit_point)
                    corporate_users = CorporateUser.objects.filter(this_user_admin = userdetails)
                    for i in corporate_users:
                        total_payable += float(i.used_credit_point)
                    context = {
                    'userdetails': userdetails, 
                    'associated_corporate_users': associated_corporate_users,
                    'validity_time': validity_time,
                    'credit_requests': credit_requests,
                    'last_month_payment': (total_payable_of_member_last_month + total_payable_of_users_last_month),
                    'payment_till_now': (total_payable_of_member_this_month + total_payable_of_users_this_month + total_payable_of_member_last_month + total_payable_of_users_last_month),
                    'total_payable': total_payable,
                    }
                    print("Phase-4")    
                    return render(request, 'institutional/CorporateMemberDashboard.html', context)
                else:
                    application = CorporateMember.objects.get(user=user)
                    message = "Your Registration request for Corporate Membership is under review."
                    application_type = "CorporateMembership"
                    print("Phase-5")    
            if CorporateUser.objects.filter(user=user).exists():
                print("Phase-1")    
                if CorporateUser.objects.filter(user= user, is_approved="banned").exists():
                    print("Phase-2")  
                    return render(request, 'institutional/corporateUserBan.html')
                if CorporateUser.objects.filter(user= user, is_approved="active").exists():
                    userdetails = CorporateUser.objects.get(user= user, is_approved="active")
                    input_dt = datetime.now()
                    next_month = input_dt.replace(day=28) + timedelta(days=4)
                    validity_time = next_month - timedelta(days=next_month.day)
                    transactions = Transaction.objects.filter(user=user)
                    print("Phase-3")  
                    credit_requests_send = CreditRequest.objects.filter(request_from=userdetails)
                    context = {
                    'userdetails': userdetails, 
                    'validity_time': validity_time,
                    'credit_requests_send': credit_requests_send,
                    'transactions': transactions,
                    }
                    print("Phase-4")  
                    return render(request, 'institutional/CorporateUserDashboard.html', context)
                
            if Institute.objects.filter(user=user).exists():
                print("Phase-1")  
                if Institute.objects.filter(user= user, is_approved="pending").exists():
                    print("Phase-2")  
                    return render(request, 'institutional/application_under_review.html')
                elif Institute.objects.filter(user= user, is_approved="approved").exists():
                    userdetails = Institute.objects.get(user= user, is_approved="approved")
                    affiliated_student = AffiliatedStudent.objects.filter(institute=userdetails)
                    for auser in affiliated_student:
                        total_payable_of_students_this_month += float(auser.used_credit_point) 
                    for auser in affiliated_student:
                        total_payable_of_students_last_month += float(auser.pending_payment)
                    total_payable_of_institute_last_month = float(userdetails.pending_payment)
                    total_payable_of_institute_this_month = float(userdetails.used_credit_point)
                    input_dt = datetime.now()
                    next_month = input_dt.replace(day=28) + timedelta(days=4)
                    print("Phase-3")  
                    validity_time = next_month - timedelta(days=next_month.day)
                    credit_requests = CreditRequestStudent.objects.filter(request_to=userdetails)
                    total_payable = 0
                    total_payable += float(userdetails.used_credit_point)
                    affiliated_students = AffiliatedStudent.objects.filter(institute = userdetails)
                    for i in affiliated_students:
                        total_payable += float(i.used_credit_point)
                    context = {
                    'total_payable': total_payable,
                    'userdetails': userdetails, 
                    'affiliated_student': affiliated_student,
                    'validity_time': validity_time,
                    'credit_requests': credit_requests,
                    'last_month_payment': (total_payable_of_institute_last_month + total_payable_of_students_last_month),
                    'payment_till_now': (total_payable_of_institute_this_month + total_payable_of_students_this_month + total_payable_of_institute_last_month + total_payable_of_students_last_month),
                    }
                    print("Phase-4")  
                    return render(request, 'institutional/InstituteDashboard.html', context)
                else:
                    application = Institute.objects.get(user=user)
                    message = "Your Registration request for Institute Membership is under review."
                    application_type = "InstituteMembership"
                    print("Phase-5")  
            if AffiliatedStudent.objects.filter(user=user).exists():
                print("Phase-1")  
                if AffiliatedStudent.objects.filter(user= user, is_approved="pending").exists():
                    print("Phase-2")  
                    return render(request, 'institutional/application_under_review.html')
                elif AffiliatedStudent.objects.filter(user= user, is_approved="approved").exists():
                    userdetails = AffiliatedStudent.objects.get(user= user, is_approved="approved")
                    credit_requests = CreditRequestStudent.objects.filter(request_from=userdetails)
                    transactions = Transaction.objects.filter(user=user)
                    print("Phase-3")  
                    context = {
                    'userdetails': userdetails, 
                    'credit_requests': credit_requests,
                    'transactions': transactions,
                    }
                    print("Phase-4")  
                    return render(request, 'institutional/AffiliatedStudentDashboard.html', context)
                else:
                    application = AffiliatedStudent.objects.get(user=user)
                    message = "Your Registration request for Affiliated Student Membership is under review."
                    application_type = "AffiliatedStudentMembership"
                    print("Phase-5")  
                    return render(request, 'institutional/corporateUserBan.html')
            if UnaffiliatedStudent.objects.filter(user=user).exists():
                print("Phase-1")  
                if UnaffiliatedStudent.objects.filter(user= user, is_approved="pending").exists():
                    print("Phase-2")  
                    return render(request, 'institutional/application_under_review.html')
                elif UnaffiliatedStudent.objects.filter(user= user, is_approved="approved").exists():
                    userdetails = UnaffiliatedStudent.objects.get(user= user, is_approved="approved")
                    context = {
                    'userdetails': userdetails,
                    }
                    print("Phase-3")  
                    return render(request, 'institutional/UnaffiliatedStudentDashboard.html', context)
                else:
                    application = UnaffiliatedStudent.objects.get(user=user)
                    message = "Your Registration request for Unaffiliated Student Membership is under review."
                    application_type = "UnaffiliatedStudentMembership"
                    print("Phase-4")  
            if WaitForInstituteStudent.objects.filter(user=user).exists():
                print("Phase-1")  
                if WaitForInstituteStudent.objects.filter(user= user, is_approved="pending").exists():
                    print("Phase-2")  
                    return render(request, 'institutional/application_under_review.html')
                elif WaitForInstituteStudent.objects.filter(user= user, is_approved="approved").exists():
                    userdetails = WaitForInstituteStudent.objects.get(user= user, is_approved="approved")
                    institute_registered = Institute.objects.filter(institute_email= userdetails.institute_email).exists()
                    print("Phase-3")  
                    context = {
                    'userdetails': userdetails,
                    'institute_registered': institute_registered,
                    }
                    print("Phase-4")  
                    return render(request, 'institutional/WaitForInstituteStudentDashboard.html', context)
                else:
                    application = WaitForInstituteStudent.objects.get(user=user)
                    message = "Your Registration request for Wait For Institute Student Membership is under review."
                    application_type = "WaitForInstituteStudentMembership"
                    print("Phase-5")  
            context = {
            'message': message,
            'application': application,
            'application_type': application_type,
            }
            print("Phase-6")  
            return render(request, 'institutional/Reject_Application.html', context)
        message = "You have not Taken any membership yet!! Please Take any membership to view the Member Dashboard."
        context = {
            'message': message,
        }
        return render(request, "institutional/intermidiate.html", context)
    

class CorporateMemberViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = CorporateMember.objects.all()
        serializer = CorporateMemberSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        member = CorporateMember.objects.get(pk=pk)
        serializer = CorporateMemberSerializer(member)
        return Response(serializer.data)

    def create(self, request):
        serializer = CorporateMemberSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            sendmail(to_email=[request.data.get("contact_person_email")], email_code="IP1")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        member = CorporateMember.objects.get(pk=pk)
        serializer = CorporateMemberSerializer(member, data=request.data)
        if serializer.is_valid():
            serializer.save()
            
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        member = CorporateMember.objects.get(pk=pk)
        serializer = CorporateMemberSerializer(member, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            
            if request.data.get("is_approved") == "rejected":
                sendmail(to_email=[member.contact_person_email], email_code="IP3")
            if request.data.get("is_approved")  == "approved":
                sendmail(to_email=[member.contact_person_email], email_code="IP2")
            
            
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        member = CorporateMember.objects.get(pk=pk)
        member.delete()
        return Response(status=204)


class CorporateUserViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = CorporateUser.objects.all()
        serializer = CorporateUserSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        user = CorporateUser.objects.get(pk=pk)
        serializer = CorporateUserSerializer(user)
        return Response(serializer.data)

    def create(self, request):
        serializer = CorporateUserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            em = CorporateMember.objects.get(corporate_member_uuid = request.data.get("this_user_admin"))
            sendmail(to_email=[em.contact_person_email],email_code="IP4")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        user = CorporateUser.objects.get(pk=pk)
        serializer = CorporateUserSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        user = CorporateUser.objects.get(pk=pk)
        serializer = CorporateUserSerializer(user, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()

            if request.data.get("is_approved") == 'active' :
                sendmail(to_email=[user.contact_person_email], email_code="IP15")
            if request.data.get("is_approved") == 'banned' :
                sendmail(to_email=[user.contact_person_email], email_code="IP14")
            if (request.data.get("services_access_premise_pool") == user.services_access_premise_pool):
                sendmail(to_email=[user.contact_person_email], email_code="IP11")
            
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        user = CorporateUser.objects.get(pk=pk)
        user.delete()
        sendmail(to_email=[user.contact_person_email], email_code="IP3")
        return Response(status=204)


class TransactionViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Transaction.objects.all()
        serializer = TransactionSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        transaction = Transaction.objects.get(pk=pk)
        serializer = TransactionSerializer(transaction)
        return Response(serializer.data)

    def create(self, request):
        serializer = TransactionSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        transaction = Transaction.objects.get(pk=pk)
        serializer = TransactionSerializer(transaction, data=request.data)
        if serializer.is_valid():
            serializer.save()
            # 
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        transaction = Transaction.objects.get(pk=pk)
        serializer = TransactionSerializer(transaction, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            # 
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        transaction = Transaction.objects.get(pk=pk)
        transaction.delete()
        return Response(status=204)


class CreditRequestViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = CreditRequest.objects.all()
        serializer = CreditRequestSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        credit_request = CreditRequest.objects.get(pk=pk)
        serializer = CreditRequestSerializer(credit_request)
        return Response(serializer.data)

    def create(self, request):
        serializer = CreditRequestSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            useremail = CorporateUser.objects.get(corporate_user_uuid = request.data.get("request_from"))
            sendmail(to_email=[useremail.contact_person_email], email_code="IP5")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        credit_request = CreditRequest.objects.get(pk=pk)
        serializer = CreditRequestSerializer(credit_request, data=request.data)
        if serializer.is_valid():
            serializer.save()
            
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
    
    def partial_update(self, request, pk=None):
        credit_request = CreditRequest.objects.get(pk=pk)
        serializer = CreditRequestSerializer(credit_request, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        credit_request = CreditRequest.objects.get(pk=pk)
        credit_request.delete()
        sendmail(to_email=[credit_request.request_from.contact_person_email], email_code="IP7")
        return Response(status=204)

class CreditRequestMemberViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = CreditRequestFromMember.objects.all()
        serializer = CreditRequestMemberSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        credit_request = CreditRequestFromMember.objects.get(pk=pk)
        serializer = CreditRequestMemberSerializer(credit_request)
        return Response(serializer.data)

    def create(self, request):
        serializer = CreditRequestMemberSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            useremail = CorporateMember.objects.get(corporate_member_uuid = request.data.get("request_from"))
            sendmail(to_email=[useremail.contact_person_email], email_code="IP8")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        credit_request = CreditRequestFromMember.objects.get(pk=pk)
        serializer = CreditRequestMemberSerializer(credit_request, data=request.data)
        if serializer.is_valid():
            serializer.save()
        # 
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
    
    def partial_update(self, request, pk=None):
        credit_request = CreditRequestFromMember.objects.get(pk=pk)
        serializer = CreditRequestMemberSerializer(credit_request, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        credit_request = CreditRequestFromMember.objects.get(pk=pk)
        credit_request.delete()
        sendmail(to_email=[credit_request.request_from.contact_person_email], email_code="IP10")
        return Response(status=204)
    

class PaymentViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Payment.objects.all()
        serializer = PaymentSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        payment = Payment.objects.get(pk=pk)
        serializer = PaymentSerializer(payment)
        return Response(serializer.data)

    def create(self, request):
        serializer = PaymentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        payment = Payment.objects.get(pk=pk)
        serializer = PaymentSerializer(payment, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        payment = Payment.objects.get(pk=pk)
        serializer = PaymentSerializer(payment, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        payment = Payment.objects.get(pk=pk)
        payment.delete()
        return Response(status=204)
    


class InstituteViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Institute.objects.all()
        serializer = InstituteSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        institute = Institute.objects.get(pk=pk)
        serializer = InstituteSerializer(institute)
        return Response(serializer.data)

    def create(self, request):
        serializer = InstituteSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            sendmail(to_email=[request.data.get("institute_email")], email_code="IP16")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        institute = Institute.objects.get(pk=pk)
        serializer = InstituteSerializer(institute, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        institute = Institute.objects.get(pk=pk)
        serializer = InstituteSerializer(institute, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            if request.data.get("is_approved") == "rejected":
                sendmail(to_email=[institute.admin_email], email_code="IP18")
            if request.data.get("is_approved")  == "approved":
                sendmail(to_email=[institute.admin_email], email_code="IP17")
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        institute = Institute.objects.get(pk=pk)
        institute.delete()
        return Response(status=204)    
        
            

class AffiliatedStudentViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = AffiliatedStudent.objects.all()
        serializer = AffiliatedStudentSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        affiliated_student = AffiliatedStudent.objects.get(pk=pk)
        serializer = AffiliatedStudentSerializer(affiliated_student)
        return Response(serializer.data)

    def create(self, request):
        serializer = AffiliatedStudentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            sendmail(to_email=[request.data.get("student_institute_email")], email_code="IP30")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        affiliated_student = AffiliatedStudent.objects.get(pk=pk)
        serializer = AffiliatedStudentSerializer(affiliated_student, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        affiliated_student = AffiliatedStudent.objects.get(pk=pk)
        serializer = AffiliatedStudentSerializer(affiliated_student, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            if request.data.get("is_approved") == 'approved' :
                sendmail(to_email=[affiliated_student.student_institute_email], email_code="IP28")
            if request.data.get("is_approved") == 'rejected' :
                sendmail(to_email=[affiliated_student.student_institute_email], email_code="IP27")
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        affiliated_student = AffiliatedStudent.objects.get(pk=pk)
        affiliated_student.delete()
        return Response(status=204)




class UnaffiliatedStudentViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = UnaffiliatedStudent.objects.all()
        serializer = UnaffiliatedStudentSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        unaffiliated_student = UnaffiliatedStudent.objects.get(pk=pk)
        serializer = UnaffiliatedStudentSerializer(unaffiliated_student)
        return Response(serializer.data)

    def create(self, request):
        serializer = UnaffiliatedStudentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            sendmail(to_email=[request.data.get("student_institute_email")], email_code="IP34")
            
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        unaffiliated_student = UnaffiliatedStudent.objects.get(pk=pk)
        serializer = UnaffiliatedStudentSerializer(unaffiliated_student, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        unaffiliated_student = UnaffiliatedStudent.objects.get(pk=pk)
        serializer = UnaffiliatedStudentSerializer(unaffiliated_student, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
           
            if request.data.get("is_approved") == 'approved' :
                sendmail(to_email=[unaffiliated_student.email], email_code="IP35")
            if request.data.get("is_approved") == 'rejected' :
                sendmail(to_email=[unaffiliated_student.email], email_code="IP36")
                
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        unaffiliated_student = UnaffiliatedStudent.objects.get(pk=pk)
        unaffiliated_student.delete()
        return Response(status=204)
    

class WaitForInstituteStudentViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = WaitForInstituteStudent.objects.all()
        serializer = WaitForInstituteStudentSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        wait_for_institute_student = WaitForInstituteStudent.objects.get(pk=pk)
        serializer = WaitForInstituteStudentSerializer(wait_for_institute_student)
        return Response(serializer.data)

    def create(self, request):
        serializer = WaitForInstituteStudentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            sendmail(to_email=[request.data.get("student_institute_email")], email_code="IP37")
            sendmail(to_email=[request.data.get("institute_email")], email_code="IP40")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        wait_for_institute_student = WaitForInstituteStudent.objects.get(pk=pk)
        serializer = WaitForInstituteStudentSerializer(wait_for_institute_student, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def partial_update(self, request, pk=None):
        wait_for_institute_student = WaitForInstituteStudent.objects.get(pk=pk)
        serializer = WaitForInstituteStudentSerializer(wait_for_institute_student, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            if request.data.get("is_approved") == 'approved' :
                sendmail(to_email=[wait_for_institute_student.email], email_code="IP38")
            if request.data.get("is_approved") == 'rejected' :
                sendmail(to_email=[wait_for_institute_student.email], email_code="IP39")
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        wait_for_institute_student = WaitForInstituteStudent.objects.get(pk=pk)
        wait_for_institute_student.delete()
        return Response(status=204)
    

class CreditRequestStudentViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = CreditRequestStudent.objects.all()
        serializer = CreditRequestStudentSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        credit_request = CreditRequestStudent.objects.get(pk=pk)
        serializer = CreditRequestStudentSerializer(credit_request)
        return Response(serializer.data)

    def create(self, request):
        serializer = CreditRequestStudentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            Afem = AffiliatedStudent.objects.get(affiliated_student_uuid = request.data.get("request_from"))
            sendmail(to_email=[Afem.student_institute_email], email_code="IP20")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        credit_request = CreditRequestStudent.objects.get(pk=pk)
        serializer = CreditRequestStudentSerializer(credit_request, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
    
    def partial_update(self, request, pk=None):
        credit_request = CreditRequestStudent.objects.get(pk=pk)
        serializer = CreditRequestStudentSerializer(credit_request, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            # 
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        credit_request = CreditRequestStudent.objects.get(pk=pk)
        credit_request.delete()
        sendmail(to_email=[credit_request.request_from.student_institute_email], email_code="IP21")
        return Response(status=204)    

    
class CreditRequestInstituteViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = CreditRequestInstitute.objects.all()
        serializer = CreditRequestInstituteSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        credit_request = CreditRequestInstitute.objects.get(pk=pk)
        serializer = CreditRequestInstituteSerializer(credit_request)
        return Response(serializer.data)

    def create(self, request):
        serializer = CreditRequestInstituteSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            em = Institute.objects.get(institute_uuid=request.data.get("request_from"))
            sendmail(to_email=[em.admin_email], email_code="IP22")
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        credit_request = CreditRequestInstitute.objects.get(pk=pk)
        serializer = CreditRequestInstituteSerializer(credit_request, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
    
    def partial_update(self, request, pk=None):
        credit_request = CreditRequestInstitute.objects.get(pk=pk)
        serializer = CreditRequestInstituteSerializer(credit_request, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        credit_request = CreditRequestInstitute.objects.get(pk=pk)
        credit_request.delete()
        sendmail(to_email=[credit_request.request_from.institute_email], email_code="IP23")
        return Response(status=204)
    


def get_user_transactions(request, user_id):
    user = get_object_or_404(User, id=user_id)
    transactions = Transaction.objects.filter(user=user)

    # Create a list to hold the serialized transaction data
    serialized_transactions = []

    # Serialize each transaction and add it to the list
    for transaction in transactions:
        serialized_transaction = {
            'transaction_uuid': str(transaction.transaction_uuid),
            'user': transaction.user.username,
            'date': transaction.date.isoformat(),
            'user_type': transaction.user_type,
            'service_type': transaction.service_type,
            'amount': str(transaction.amount),
        }
        serialized_transactions.append(serialized_transaction)

    # Return the serialized transactions as JSON response
    return JsonResponse(serialized_transactions, safe=False)


def check_corporate_user_exists(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        # Perform the logic to check if a user with the provided name and email exists
        user_exists = User.objects.filter(email=email).exists()
        if user_exists:
            corporate_user_exists = CorporateUser.objects.filter(contact_person_email=email).exists()
            if corporate_user_exists:
                response_data = {
                    'userExists': 'corporate_user'
                }

                return JsonResponse(response_data)
            else:
                user = User.objects.get(email=email)
                response_data = {
                    'userExists': 'normal_user',
                    'userId': user.pk
                }
                return JsonResponse(response_data)
        else:
            response_data = {
                'userExists': 'not_user'
            }
        
        return JsonResponse(response_data)

    return JsonResponse({'error': 'Invalid request method'})   


def check_domain_available(request):
    if request.method == 'POST':
        domain_name = request.POST.get('domainname')
        # Perform the logic to check if a user with the provided name and email exists
        user_exists = Institute.objects.filter(domain_name=domain_name).exists()
        response_data = {
                    'userExists': True
                }
        if user_exists:
            institute = Institute.objects.filter(domain_name=domain_name).exists()
            if institute:
                response_data = {
                    'userExists': False
                }
        return JsonResponse(response_data)

    return JsonResponse({'error': 'Invalid request method'}) 

def make_transaction(user, service_type, service_id, amount):
    user = User.objects.get(pk=user)
    print("User Found")
    print(service_type)

    if CorporateUser.objects.filter(user=user).exists():
        user_type = 'corporate_user'
    elif CorporateMember.objects.filter(user=user).exists():
        user_type = 'corporate_member'
    elif Institute.objects.filter(user=user).exists():
        user_type = 'institute'
    elif AffiliatedStudent.objects.filter(user=user).exists():
        user_type = 'student'
    else:
        user_type = ''

    if CorporateUser.objects.filter(user=user).exists():
        print("Corporate User")
        cuser = CorporateUser.objects.get(user=user)
        print("cuser")
        cuadmin = cuser.this_user_admin
        print('cuadmin')
        print(cuser.services_access_subtitle)
        print(cuser.services_access_viewers_lounge)
        print(cuser.services_access_project_center)
        print(cuser.services_access_conversion)
        print(cuser.services_access_script_builder)
        print(cuser.services_access_script_builder)
        

        if cuser.is_approved != "active":
            return False

        if float(cuser.available_credit_points) <= float(amount):
            return False

        if service_type == 'Subtitle':
            print("--------------1")
            print(cuser.services_access_subtitle)
            if cuser.services_access_subtitle == False:
                return False
        if service_type == 'Viewers Lounge':
            print("--------------2")
            print(cuser.services_access_viewers_lounge)
            if cuser.services_access_viewers_lounge == False:
                return False
        if service_type == 'Project Center':
            print("--------------3")
            print(cuser.services_access_project_center)
            if cuser.services_access_project_center == False:
                return False
        if service_type == 'Conversion':
            print("--------------4")
            print(cuser.services_access_conversion)
            if cuser.services_access_conversion == False:
                return False
        if service_type == 'Narration':
            print("--------------5")
            print(cuser.services_access_narration)
            if cuser.services_access_narration  == False:
                return False
        if service_type == 'Script Builder':
            print("--------------6")
            print(cuser.services_access_script_builder)
            if cuser.services_access_script_builde  == Falser:
                return False
        if service_type == 'Premise Pool':
            print("--------------7")
            print(cuser.services_access_premise_pool)
            if cuser.services_access_premise_pool  == False:
                return False
        try:
            with db_transaction.atomic():
                transaction = Transaction.objects.create(
                user=user,
                user_type=user_type,
                service_type=service_type,
                service_id=service_id, 
                amount=amount,
                date=timezone.now() 
                )
            print('transaction added')
            cuser.available_credit_points = float(cuser.available_credit_points) - float(amount)
            print("user available_credit_points")
            cuser.used_credit_point  = float(cuser.used_credit_point) + float(amount)
            print("user used_credit_point")
            cuser.pending_payment  = float(cuser.pending_payment) + float(amount)
            print("user pending_payment")
            cuadmin.pending_payment  = float(cuadmin.pending_payment) + float(amount)
            print("user admin pending_payment")
            cuser.save()
            cuadmin.save()
            return True
        except:
            return False

    elif CorporateMember.objects.filter(user=user).exists():
        print("Corporate Member")
        member = CorporateMember.objects.get(user=user)
        print('member')
        if member.is_approved != "approved":
            return False

        if float(member.available_credit_points) <= float(amount):
            return False

        try:
            with db_transaction.atomic():
                transaction = Transaction.objects.create(
                    user=user,
                    user_type=user_type,
                    service_type=service_type,
                    service_id=service_id, 
                    amount=amount,
                    date=timezone.now() 
                )
            print('transaction added')
            member.available_credit_points = float(member.available_credit_points) - float(amount)
            print('member available_credit_points')
            member.used_credit_point = float(member.used_credit_point) + float(amount)
            print('member used_credit_point')
            member.pending_payment = float(member.pending_payment) + float(amount)
            print('member pending_payment')
            member.save()
            return True
        except:
            return False
    
    elif AffiliatedStudent.objects.filter(user=user).exists():
        print('AffiliatedStudent')
        astudent = AffiliatedStudent.objects.get(user=user)
        print('astudent')
        asinstitute = astudent.institute
        print('asinstitute')

        if astudent.is_approved != "approved":
            return False

        if float(astudent.available_credit_points) <= float(amount):
            return False

        try:
            with db_transaction.atomic():
                transaction = Transaction.objects.create(
                user=user,
                user_type=user_type,
                service_type=service_type,
                service_id=service_id, 
                amount=amount,
                date=timezone.now() 
                )
            print('transaction added')
            astudent.available_credit_points = float(astudent.available_credit_points) - float(amount)
            print('astudent available_credit_points')
            astudent.used_credit_point = float(astudent.used_credit_point) + float(amount)
            print('astudent used_credit_point')
            astudent.pending_payment = float(astudent.pending_payment) + float(amount)
            print('astudent pending_payment')
            asinstitute.pending_payment = float(asinstitute.pending_payment) + float(amount)
            print('asinstitute pending_payment')

            astudent.save()
            asinstitute.save()
            return True
        except:
            return False

    elif Institute.objects.filter(user=user).exists():
        print('Institute')
        institute = Institute.objects.get(user=user)
        print('institute')
        if institute.is_approved != "approved":
            return False

        if float(institute.available_credit_points) <= float(amount):
            return False

        try:
            with db_transaction.atomic():
                transaction = Transaction.objects.create(
                    user=user,
                    user_type=user_type,
                    service_type=service_type,
                    service_id=service_id, 
                    amount=amount,
                    date=timezone.now() 
                )
            print('transaction added')
            institute.available_credit_points = float(institute.available_credit_points) - float(amount)
            print('institute available_credit_points')
            institute.used_credit_point = float(institute.used_credit_point) + float(amount)
            print('institute used_credit_point')
            institute.pending_payment = float(institute.pending_payment) + float(amount)
            print('institute pending_payment')
            institute.save()
            return True
        except:
            return False
    else:
        return False
    

def run_credit_transfer(request):

    # Filter corporate members and users whose join date is before the first day of the next month
    corporate_members = CorporateMember.objects.all()
    corporate_users = CorporateUser.objects.all()

    # Transfer used_credit_points to pending_payment for corporate members
    with transaction.atomic():
        for member in corporate_members:
            member.pending_payment += float(member.used_credit_point)
            member.used_credit_point = 0.0
            member.credit_limit = member.requested_credit_point
            member.available_credit_points = member.requested_credit_point
            member.save()

    # Transfer used_credit_points to pending_payment for corporate users
    with transaction.atomic():
        for user in corporate_users:
            user.pending_payment += float(user.used_credit_point)
            user.used_credit_point = 0.0
            user.save()
    
    institutes = Institute.objects.all()
    astudents = AffiliatedStudent.objects.all()

    # Transfer used_credit_points to pending_payment for Institute
    with transaction.atomic():
        for institute in institutes:
            institute.pending_payment += float(institute.used_credit_point)
            institute.used_credit_point = 0.0
            institute.credit_limit = institute.requested_credit_point
            institute.available_credit_points = institute.requested_credit_point
            institute.save()

    # Transfer used_credit_points to pending_payment for Affiliated Students
    with transaction.atomic():
        for astudent in astudents:
            astudent.pending_payment += float(astudent.used_credit_point)
            astudent.used_credit_point = 0.0
            astudent.save()

    return HttpResponse("Credit transfer completed successfully.")


def get_discount(user_id, amount):
    user = User.objects.get(pk=user_id)
    payable_after_s_discount = amount - ((amount*50)/100)
    if UnaffiliatedStudent.objects.filter(user=user).exists():
        user = UnaffiliatedStudent.objects.get(user=user)
        if float(user.free_credits) >= float(payable_after_s_discount):
            return 100
        if float(user.free_credits) != 0.0:
            return ((float(user.free_credits)/amount)*100) + 50 
        return discount_limit_handler(DISCOUNT["student_discount"])
    elif WaitForInstituteStudent.objects.filter(user=user).exists():
        user = WaitForInstituteStudent.objects.get(user=user)
        if float(user.free_credits) >= float(payable_after_s_discount):
            return 100
        if float(user.free_credits) != 0.00:
            return ((float(user.free_credits)/amount)*100) + 50
        return discount_limit_handler(DISCOUNT["student_discount"])
    elif AffiliatedStudent.objects.filter(user=user).exists():
        user = AffiliatedStudent.objects.get(user=user)
        if float(user.free_credits) >= float(payable_after_s_discount):
            return 100
        if float(user.free_credits) != 0:
            return ((float(user.free_credits)/amount)*100) + 50
        return discount_limit_handler(DISCOUNT["student_discount"])
    else:
        return 0
    
def after_student_discount(user_id, amount):
    user = User.objects.get(pk=user_id)
    
    if UnaffiliatedStudent.objects.filter(user=user).exists():
        user = UnaffiliatedStudent.objects.get(user=user)
        user.free_credits -= amount
        user.save()
        
        return True
    elif WaitForInstituteStudent.objects.filter(user=user).exists():
        user = WaitForInstituteStudent.objects.get(user=user)
        user.free_credits -= amount
        user.save()
        
        return True
    elif AffiliatedStudent.objects.filter(user=user).exists():
        user = AffiliatedStudent.objects.get(user=user)
        user.free_credits -= amount
        user.save()
        
        return True
    else:
        return False

def check_institute_exists(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        # Perform the logic to check if a user with the provided name and email exists
        institute = Institute.objects.filter(institute_email=email).exists()
        if institute:
            response_data = {
                'userExists': True,
                'uuid': Institute.objects.get(institute_email=email).institute_uuid,
            }
            return JsonResponse(response_data)
        else:
            response_data = {
                'userExists': False,
            }
            return JsonResponse(response_data)

    return JsonResponse({'error': 'Invalid request method'})   


def update_transactions(user_id, amount):
    user = User.objects.get(pk=user_id)
    total_payable_of_users_this_month = total_payable_of_users_last_month = total_payable_of_member_last_month = total_payable_of_member_this_month = last_month_payment = payment_till_now = 0
    if CorporateMember.objects.filter(user=user).exists():
        userdetails = CorporateMember.objects.get(user= user, is_approved="approved")
        associated_corporate_users = CorporateUser.objects.filter(this_user_admin=userdetails)
        for auser in associated_corporate_users:
            total_payable_of_users_this_month += float(auser.used_credit_point) 
        for auser in associated_corporate_users:
            total_payable_of_users_last_month += float(auser.pending_payment)
        total_payable_of_member_last_month = float(userdetails.pending_payment)
        total_payable_of_member_this_month = float(userdetails.used_credit_point)
        last_month_payment= float(total_payable_of_member_last_month + total_payable_of_users_last_month)
        payment_till_now = float(total_payable_of_member_this_month + total_payable_of_users_this_month + total_payable_of_member_last_month + total_payable_of_users_last_month)
        if amount == payment_till_now:
            print(amount, last_month_payment)
            print("Paid all payments of the last month!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
            member = CorporateMember.objects.get(user = user)
            # Calculate the start and end dates of the last month
            today = datetime.now()
            last_month_end_date = today.replace(day=1) - timedelta(days=1)
            last_month_start_date = last_month_end_date.replace(day=1)
            # Get the associated CorporateUsers
            associated_users = CorporateUser.objects.filter(this_user_admin=member)
            # Create a list of user IDs for the associated CorporateUsers
            associated_user_ids = list(associated_users.values_list('user__id', flat=True))
            # Add the CorporateMember's user ID to the list
            associated_user_ids.append(member.user.id)
            print(associated_user_ids)
            last_month_transactions = Transaction.objects.filter(
                Q(user__id__in=associated_user_ids) &
                Q(date__gte=last_month_start_date, date__lte=today) &
                Q(status='pending')
            )
            for last_month_transaction in last_month_transactions:
                print(last_month_transaction.transaction_uuid)
            #last_month_transactions.update(status='paid')
            print(amount, payment_till_now)
            print("Paid all payments till now!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
            return True
        elif amount == last_month_payment:
            print(amount, last_month_payment)
            print("Paid all payments of the last month!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
            member = CorporateMember.objects.get(user = user)
            # Calculate the start and end dates of the last month
            today = datetime.now()
            last_month_end_date = today.replace(day=1) - timedelta(days=1)
            last_month_start_date = last_month_end_date.replace(day=1)
            # Get the associated CorporateUsers
            associated_users = CorporateUser.objects.filter(this_user_admin=member)
            # Create a list of user IDs for the associated CorporateUsers
            associated_user_ids = list(associated_users.values_list('user__id', flat=True))
            # Add the CorporateMember's user ID to the list
            associated_user_ids.append(member.user.id)
            print(associated_user_ids)
            last_month_transactions = Transaction.objects.filter(
                Q(user__id__in=associated_user_ids) &
                Q(date__gte=last_month_start_date, date__lte=last_month_end_date) &
                Q(status='pending')
            )
            for last_month_transaction in last_month_transactions:
                print(last_month_transaction.transaction_uuid)
            #last_month_transactions.update(status='paid')
            return True
        else:
            print(amount, last_month_payment, payment_till_now)
            print("Something went wrong")
            return False
    return False


def open_bill_corporate(request):
    if request.method == 'POST':
        total_payable = 0.0
        uuid = request.POST['uuid']
        corporate_member = CorporateMember.objects.get(corporate_member_uuid = uuid)
        total_payable += float(corporate_member.used_credit_point)
        corporate_users = CorporateUser.objects.filter(this_user_admin = corporate_member)
        for i in corporate_users:
            total_payable += float(i.used_credit_point)
        transactions = Transaction.objects.filter(user=corporate_member.user, status='pending')
        corporate_users_transactions = {}
        for i in corporate_users:
            user_transactions = Transaction.objects.filter(user=i.user, status='pending')
            corporate_users_transactions[i.corporate_user_uuid] = {
                'name': i.name,
                'transactions': user_transactions
            }
        discount_percentage = 0
        discount_value = 0.0
        if total_payable <= 5000.00:
            discount_percentage = 10
            discount_value = round(float((total_payable*10)/100),2)
        elif total_payable > 5000.00 and total_payable <= 25000.00:
            discount_percentage = 20
            discount_value = round(float((total_payable*20)/100),2)
        else:
            discount_percentage = 30
            discount_value = round(float((total_payable*30)/100),2)
        final_payable = round(float(total_payable) - float(discount_value),2)
        context={
            'corporate_member': corporate_member,
            'corporate_users': corporate_users,
            'total_payable': total_payable,
            'transactions': transactions,
            'corporate_users_transactions': corporate_users_transactions,
            'discount_percentage': discount_percentage,
            'discount_value': discount_value,
            'final_payable': final_payable,

        }

        return render(request, 'institutional/corporate_bill.html', context=context)

def payment_received_corporate_member(request):
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            uuid = data.get('uuid')
            if uuid:
                corporate_member = CorporateMember.objects.get(corporate_member_uuid=uuid)
                corporate_member.used_credit_point = 0
                corporate_member.available_credit_points = corporate_member.requested_credit_point
                corporate_member.save()

                # Update status for corporate member's transactions
                member_transactions = Transaction.objects.filter(user=corporate_member.user, status='pending')
                member_transactions.update(status='paid')

                # Update status for corporate users' transactions
                corporate_users = corporate_member.corporateuser_set.all()
                for user in corporate_users:
                    user.used_credit_point = 0
                    user.available_credit_points = user.credit_limit
                    user.save()

                    user_transactions = Transaction.objects.filter(user=user.user, status='pending')
                    user_transactions.update(status='paid')
                sendmail(to_email=[corporate_member.contact_person_email], email_code="IP12")
                return JsonResponse({'message': 'Transactions updated successfully.'})
            else:
                return JsonResponse({'message': 'UUID is missing or invalid.'}, status=400)
        except json.JSONDecodeError:
            return JsonResponse({'message': 'Invalid JSON data.'}, status=400)


def open_bill_institute(request):
    if request.method == 'POST':
        total_payable = 0.0
        uuid = request.POST['uuid']
        institute = Institute.objects.get(institute_uuid = uuid)
        total_payable += float(institute.used_credit_point)
        affiliated_students = AffiliatedStudent.objects.filter(institute = institute)
        for i in affiliated_students:
            total_payable += float(i.used_credit_point)
        transactions = Transaction.objects.filter(user=institute.user, status='pending')
        affiliated_student_transactions = {}
        for i in affiliated_students:
            user_transactions = Transaction.objects.filter(user=i.user, status='pending')
            affiliated_student_transactions[i.affiliated_student_uuid] = {
                'name': i.name,
                'transactions': user_transactions
            }
        discount_percentage = 0
        discount_value = 0.0
        if total_payable <= 5000.00:
            discount_percentage = 5
            discount_value = round(float((total_payable*5)/100),2)
        elif total_payable > 5000.00 and total_payable <= 25000.00:
            discount_percentage = 10
            discount_value = round(float((total_payable*10)/100),2)
        else:
            discount_percentage = 15
            discount_value = round(float((total_payable*15)/100),2)
        final_payable = round(float(total_payable) - float(discount_value),2)
        context={
            'institute': institute,
            'affiliated_students': affiliated_students,
            'total_payable': total_payable,
            'transactions': transactions,
            'affiliated_student_transactions': affiliated_student_transactions,
            'discount_percentage': discount_percentage,
            'discount_value': discount_value,
            'final_payable': final_payable,
        }

        return render(request, 'institutional/institute_bill.html', context=context)


def payment_received_institute_member(request):
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            uuid = data.get('uuid')
            if uuid:
                institute = Institute.objects.get(institute_uuid=uuid)
                institute.used_credit_point = 0
                institute.available_credit_points = institute.requested_credit_point
                institute.save()

                # Update status for corporate member's transactions
                member_transactions = Transaction.objects.filter(user=institute.user, status='pending')
                member_transactions.update(status='paid')

                # Update status for corporate users' transactions
                affiliated_students = institute.affiliatedstudent_set.all()
                for user in affiliated_students:
                    user.used_credit_point = 0
                    user.available_credit_points = user.credit_limit
                    user.save()

                    user_transactions = Transaction.objects.filter(user=user.user, status='pending')
                    user_transactions.update(status='paid')
                sendmail(to_email=[institute.admin_email], email_code="IP25")
                return JsonResponse({'message': 'Transactions updated successfully.'})
            else:
                return JsonResponse({'message': 'UUID is missing or invalid.'}, status=400)
        except json.JSONDecodeError:
            return JsonResponse({'message': 'Invalid JSON data.'}, status=400)

def deactivate_expired_accounts():
    today = timezone.now().date()

    # Deactivate UnaffiliatedStudent accounts
    unaffiliated_students_to_deactivate = UnaffiliatedStudent.objects.filter(is_approved='approved', end_date=today)
    for student in unaffiliated_students_to_deactivate:
        student.is_approved = 'rejected'  # Set to 'rejected' to deactivate the account
        student.save()

    # Deactivate WaitForInstituteStudent accounts
    wait_for_institute_students_to_deactivate = WaitForInstituteStudent.objects.filter(is_approved='approved', end_date=today)
    for student in wait_for_institute_students_to_deactivate:
        student.is_approved = 'rejected'  # Set to 'rejected' to deactivate the account
        student.save()


def deactivate_accounts_with_pending_payments():
    # Deactivate CorporateMember accounts with pending_payment > 0
    corporate_members_to_deactivate = CorporateMember.objects.filter(is_approved='approved', pending_payment__gt=0)
    for member in corporate_members_to_deactivate:
        # Deactivate CorporateUser accounts associated with this Corporate Member
        corporate_users_to_deactivate = CorporateUser.objects.filter(is_approved='active', this_user_admin=member)
        for user in corporate_users_to_deactivate:
            user.is_approved = 'banned'  # Set to 'banned' to deactivate the account
            user.save()
        member.is_approved = 'rejected'  # Set to 'rejected' to deactivate the account
        member.save()

    # Deactivate Institute accounts with pending_payment > 0
    institute_members_to_deactivate = InstituteMember.objects.filter(is_approved='approved', pending_payment__gt=0)
    for member in institute_members_to_deactivate:
        # Deactivate Affiliated Students accounts associated with this Institute Member
        affiliated_student_to_deactivate = AffiliatedStudentMember.objects.filter(is_approved='active', institute=member)
        for user in affiliated_student_to_deactivate:
            user.is_approved = 'rejected'  # Set to 'banned' to deactivate the account
            user.save()
        member.is_approved = 'rejected'  # Set to 'rejected' to deactivate the account
        member.save()


def send_deactivation_reminder_emails():
    today = timezone.now().date()

    # Calculate the deactivation dates for each reminder
    deactivation_dates = [
        today + timedelta(days=3),
        today + timedelta(days=15),
        today + timedelta(days=30),
    ]

    for deactivation_date in deactivation_dates:
        # Deactivate UnaffiliatedStudent accounts
        unaffiliated_students_to_remind = UnaffiliatedStudent.objects.filter(
            is_approved='approved',
            end_date=deactivation_date
        )
        for student in unaffiliated_students_to_remind:
            if deactivation_date == today + timedelta(days=3):
                email_code = "IP44"  # 3 days prior
            elif deactivation_date == today + timedelta(days=15):
                email_code = "IP49"  # 15 days prior
            elif deactivation_date == today + timedelta(days=30):
                email_code = "IP54"  # 30 days prior
            else:
                email_code = "IP"  # Default email code if none of the conditions match
            sendmail(to_email=[student.student_institute_email], email_code=email_code)

        # Deactivate WaitForInstituteStudent accounts
        wait_for_institute_students_to_remind = WaitForInstituteStudent.objects.filter(
            is_approved='approved',
            end_date=deactivation_date
        )
        for student in wait_for_institute_students_to_remind:
            if deactivation_date == today + timedelta(days=3):
                email_code = "IP45"  # 3 days prior
            elif deactivation_date == today + timedelta(days=15):
                email_code = "IP50"  # 15 days prior
            elif deactivation_date == today + timedelta(days=30):
                email_code = "IP55"  # 30 days prior
            else:
                email_code = "IP"  # Default email code if none of the conditions match
            sendmail(to_email=[student.student_institute_email], email_code=email_code)

        # Deactivate AffiliatedStudent accounts
        affiliated_students_to_remind = AffiliatedStudent.objects.filter(
            is_approved='approved',
            end_date=deactivation_date
        )
        for student in affiliated_students_to_remind:
            if deactivation_date == today + timedelta(days=3):
                email_code = "IP43"  # 3 days prior
            elif deactivation_date == today + timedelta(days=15):
                email_code = "IP48"  # 15 days prior
            elif deactivation_date == today + timedelta(days=30):
                email_code = "IP53"  # 30 days prior
            else:
                email_code = "IP"  # Default email code if none of the conditions match
            sendmail(to_email=[student.student_institute_email], email_code=email_code)

        # Deactivate CorporateMember accounts with pending_payment > 0
        corporate_members_to_remind = CorporateMember.objects.filter(
            is_approved='approved',
            pending_payment__gt=0
        )
        for member in corporate_members_to_remind:
            if deactivation_date == today + timedelta(days=3):
                email_code = "IP42"  # 3 days prior
            elif deactivation_date == today + timedelta(days=15):
                email_code = "IP47"  # 15 days prior
            elif deactivation_date == today + timedelta(days=30):
                email_code = "IP52"  # 30 days prior
            else:
                email_code = "IP"  # Default email code if none of the conditions match
            sendmail(to_email=[member.contact_person_email], email_code=email_code)

        # Deactivate Institute accounts with pending_payment > 0
        institute_members_to_remind = InstituteMember.objects.filter(
            is_approved='approved',
            pending_payment__gt=0
        )
        for member in institute_members_to_remind:
            if deactivation_date == today + timedelta(days=3):
                email_code = "IP41"  # 3 days prior
            elif deactivation_date == today + timedelta(days=15):
                email_code = "IP46"  # 15 days prior
            elif deactivation_date == today + timedelta(days=30):
                email_code = "IP51"  # 30 days prior
            else:
                email_code = "IP"  # Default email code if none of the conditions match
            sendmail(to_email=[member.institute_email], email_code=email_code)

def IM_Tut(request):
    return render(request,"institutional/itutorial.html")

def C_Tut(request):
    return render(request,"institutional/ctutorial.html")

def S_Tut(request):
    return render(request,"institutional/stutorial.html")

def C_demo(request):
    return render(request,"institutional/Corporate_demo.html")

def S_demo(request):
    return render(request,"institutional/Student_demo.html")

def IM_demo(request):
    return render(request,"institutional/intitution_demo.html")
    
def after_student_discount1(user_id, amount):
    user = User.objects.get(pk=user_id)
    print("amount neha:",amount)
    payment={}
    if UnaffiliatedStudent.objects.filter(user=user).exists():
        user = UnaffiliatedStudent.objects.get(user=user)
        free_credits = user.free_credits
        if float(free_credits) > amount:
            user.free_credits = float(free_credits) - amount
            user.save()
            payment["free_credits_student"] = user.free_credits
        elif float(free_credits) < amount:
           print("in elif")
           free_credits = amount - float(free_credits)
           user.free_credits = 0.00
           user.save()
           payment["free_credits_student"] = free_credits
           
        else:
            payment["free_credits_student"] = amount
            
        return True,payment
        
    elif WaitForInstituteStudent.objects.filter(user=user).exists():
        user = WaitForInstituteStudent.objects.get(user=user)
        free_credits = user.free_credits
        payment={}
        if float(free_credits) > amount:
            user.free_credits = float(free_credits) - amount
            user.save()
            payment["free_credits_student"] = user.free_credits
        elif float(free_credits) < amount:
           print("in elif")
           free_credits = amount - float(free_credits)
           user.free_credits = 0.00
           user.save()
           payment["free_credits_student"] = free_credits
        else:
            payment["free_credits_student"] = amount
        return True,payment
    
    elif AffiliatedStudent.objects.filter(user=user).exists():
        user = AffiliatedStudent.objects.get(user=user)
        free_credits = user.free_credits
        payment={}
        if float(free_credits) > amount:
            user.free_credits = float(free_credits) - amount
            user.save()
            payment["free_credits_student"] = user.free_credits
        elif float(free_credits) < amount:
           print("in elif")
           free_credits = amount - float(free_credits)
           user.free_credits = 0.00
           user.save()
           payment["free_credits_student"] = free_credits
        else:
            payment["free_credits_student"] = amount
        return True,payment
    else:
        return False