from appservices.common.util import *

user_managements = Blueprint("user_managements",__name__)

@user_managements.route("/add_new_user",methods=["POST","GET"])
def add_new_user():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()
        permissionsList = check_permissions(adminId,"userManagementPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                fullName = request.form.get("fullName","")
                phoneNumber = request.form.get("phoneNumber","")
                email = request.form.get("email","")
                address = request.form.get("address","")
                patternId = request.form.get("patternId","")
                entityTypeId = request.form.get("entityTypeId","")
                stateId = request.form.get("stateId","")
                cityId = request.form.get("cityId","")
                blockPoId = request.form.get("blockPoId","")
                pincodeId = request.form.get("pincodeId","")
                password = request.form.get("password","")
                businessName = request.form.get("businessName","")
                businessAddress = request.form.get("businessAddress","")
                businessRemark = request.form.get("businessRemark","")
                documentRemark = request.form.get("documentRemark","")
                videoVerificationRemark = request.form.get("videoVerificationRemark","")
                parentId = request.form.get("parentId","")
                # categoryId = request.form.get("categoryId","")
                # subCategoryId = request.form.get("subCategoryId","")
                # panNumber = request.form.get("panNumber","")
                merchantType = request.form.get("merchantType","")
                maxPayinLimit = request.form.get("maxPayinLimit",0)
                maxPayoutLimit = request.form.get("maxPayoutLimit",0)
                
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]


                if patternId and entityTypeId and merchantType:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+fullName+" Merchant created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_new_user","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                        merchant_queryset = Users.objects(phoneNumber__iexact=phoneNumber).first()
                        if merchant_queryset:
                            flash("This phone number is already in use.")
                            return redirect(url_for("user_managements.manage_users_list"))
                        # check_pan_number = validate_pan(panNumber)
                        # if check_pan_number == True:
                        user_table = Users(
                            fullName = fullName,
                            phoneNumber  = phoneNumber,
                            email  = email,
                            password  = generate_password_hash(password), 
                            address = address,
                            patternId = patternId,
                            entityTypeId = entityTypeId,
                            createdOn =datetime.datetime.now(),
                            stateId = stateId,
                            cityId = cityId,
                            blockPoId = blockPoId,
                            pincodeId = pincodeId,
                            parentId = parentId,
                            businessName = businessName,
                            businessAddress = businessAddress,
                            businessRemark=businessRemark,
                            documentRemark=documentRemark,
                            videoVerificationRemark=videoVerificationRemark,
                            # categoryId = categoryId,
                            # subCategoryId = subCategoryId,
                            merchantType = merchantType,
                            merchantUniqueNumber = generate_next_serial_number(),
                            channel="admin",
                            payoutBalance = 0,
                            walletBalance = 0,
                            maxPayinLimit = maxPayinLimit,
                            maxPayoutLimit = maxPayoutLimit,
                            status = 0
                            )
                        save_table = user_table.save()
                        userId = str(save_table.id)
                        str2hash = userId+str(random_digit_generate(9))
                        result = hashlib.md5(str2hash.encode())
                        convertMd5String = result.hexdigest()

                        save_table.update(merchantPaymentLink=convertMd5String)

                        if userId:
                            userId = userId
                            # panName = request.form.get("panName","")
                            # panStatus = request.form.get("panStatus","")
                            # panDocument = request.files.get("panDocument","")
                            # bankId = request.form.get("bankId","")
                            # bankAccountNumber = request.form.get("bankAccountNumber","")
                            # bankStatus = request.form.get("bankStatus","")
                            # ifscCode = request.form.get("ifscCode","")
                            # aadharName = request.form.get("aadharName","")
                            # aadharNumber = request.form.get("aadharNumber","")
                            # aadharStatus = request.form.get("aadharStatus","")
                            # aadharDocument = request.files.get("aadharDocument","")

                            user_kyc_table = UserKYC(
                                userId=userId,
                                panName = "",
                                panNumber  = "",
                                panStatus  = "Pending",
                                bankId  = None,
                                bankAccountNumber  = "",
                                bankStatus  = "Pending",
                                ifscCode  = "",
                                channel="admin",
                                aadharName  = "",
                                aadharNumber  = "",
                                aadharStatus  = "Pending",
                                createdOn =datetime.datetime.now(),
                                status = 1
                                )
                            save_table = user_kyc_table.save()

                            flash("Merchant created successfully!")
                            return redirect(url_for("user_managements.manage_users_list"))
                        # else:
                        #     flash("Please give valid pan number!!")
                        #     return redirect(url_for("user_managements.manage_users_list"))
                    except Exception as e:
                        flash("Unable to create merchant!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("user_managements.manage_users_list"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("user_managements.manage_users_list"))
        else:
            flash("Staff member does not have given create merchant permissions!!")
            return redirect(url_for("admin.dashboard"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to create merchant!!"
        return render_template("super_admin_templates/user_managements_list.html",error=error)


@user_managements.route("/manage_users_list",methods=["POST","GET"])
def manage_users_list():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

        rejected_count = 0
        pending_count = 0
        processing_count=0
        submitted_count=0
        approved_count=0
        total_merchants_count = 0
        pagination = None

        permissionsList = check_permissions(adminId,"userManagementPermissions")
        if "view" in permissionsList:

            manage_users_list = []
            userEntityList = []
            profilelList = []
            statesList = []
            citiesList = []
            blocksList = []
            pincodesList = []
            tenantslList = []
            usersList = []
            commissionsList = []
            allUsersCommissionsList = []
            patternsList = []
            categorysList = []
            subCategorysList = []
            masterIfscBanksList = []
            approvedUsers = []

            blocked_merchants_count = Users.objects(status=3).count()
            locked_merchants_count = Users.objects(status=5).count()
            total_merchants_count = Users.objects().count()

            merchantEmail = request.form.get('merchantEmail', '')
            merchantName = request.form.get('merchantName', '')
            merchantPhone = request.form.get('merchantPhone', '')
            merchantId = request.form.get('merchantId', '')
            
            page = request.args.get(get_page_parameter(), type=int, default=1)
            per_page = 20
            start = (page - 1) * per_page
            snoCount = int(start)
            
            users_queryset = Users.objects(status__ne=2)

            kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
            trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

            print(kycUsersList, "(((((kycUsersList)))))")
            print(trueUsersList, "(((((trueUsersList)))))")

            # Base query for UserKYC
            user_kycs_queryset = UserKYC.objects(
                panStatus="Approved",
                bankStatus="Approved",
                aadharStatus="Approved",
                agreementVerificationStatus="Approved",
                videoVerificationStatus="Approved",
                status__nin=[2,6]
            ).order_by("-submittedDate")

             
            user_kycs_queryset = user_kycs_queryset.filter(
                (Q(userId__in=kycUsersList) & Q(businessStatus="Approved") & Q(shopVideoStatus="Approved") & Q(documentsList__ne=[]) & Q(shopImagesList__ne=[]) & Q(shopImagesList__ne=None) & Q(shopImagesList__ne=[]) &
                 Q(shopImagesList__elemMatch={"shopImageStatus": "Approved"}) & Q(documentsList__elemMatch={"documentStatus": "Approved"})) |
                (Q(userId__in=trueUsersList))
            )

            # if merchantName:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__fullName__icontains=merchantName)

            # if merchantId:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__merchantUniqueNumber__icontains=merchantId)
            # if merchantEmail:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__email__icontains=merchantEmail)   
            # if merchantPhone:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__phoneNumber__icontains=merchantPhone)

            if merchantName:
                user_ids = Users.objects(fullName__icontains=merchantName).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            if merchantId:
                user_ids = Users.objects(merchantUniqueNumber__icontains=merchantId).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            if merchantEmail:
                user_ids = Users.objects(email__icontains=merchantEmail).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            if merchantPhone:
                user_ids = Users.objects(phoneNumber__icontains=merchantPhone).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            total_count=user_kycs_queryset.count()
            limited_users=user_kycs_queryset.filter().limit(per_page).skip(start)
            
            for each_user_entity in limited_users:
                userKycDict = fetching_user_details_by_kyc(each_user_entity)
                snoCount += 1
                userKycDict["snoCount"] = snoCount
                usersList.append(userKycDict)
                    
            patterns_queryset = Patterns.objects(status__in=[0,1]).order_by("-id").all()
            for each_pattern in patterns_queryset:
                pattern_dict = fetching_pattern_details(each_pattern)
                patternsList.append(pattern_dict)

            user_entities_queryset = UserEntity.objects(status__in=[1]).order_by("-id")

            for each_user_entity in user_entities_queryset:
                userEntityDict = fetching_user_entity_details(each_user_entity)
                userEntityList.append(userEntityDict)

            states_queryset = States.objects(status__in=[1]).order_by("stateName")
            for each_state in states_queryset:
                state_dict = fetching_states_details(each_state)
                statesList.append(state_dict)

            sub_merchant_categorys_queryset = MerchantSubCategories.objects(status__in=[0,1]).order_by("-id").all()
            for each_sub_merchant_category in sub_merchant_categorys_queryset:
                sub_merchant_category_dict = fetching_sub_merchant_category_details(each_sub_merchant_category)
                subCategorysList.append(sub_merchant_category_dict)


            merchant_categorys_queryset = MerchantCategories.objects(status__in=[0,1]).order_by("-id").all()
            for each_merchant_category in merchant_categorys_queryset:
                merchant_category_dict = fetching_merchant_category_details(each_merchant_category)
                categorysList.append(merchant_category_dict)

            master_ifsc_banks_queryset = MasterIFSCBank.objects(status__in=[0,1]).order_by("-id").all()
            for each_master_ifsc_bank in master_ifsc_banks_queryset:
                master_ifsc_bank_dict = fetching_master_ifsc_bank_details(each_master_ifsc_bank)
                masterIfscBanksList.append(master_ifsc_bank_dict)

            # Pagination object for rendering pagination controls in the template
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="merchants")

            
            users_kyc_queryset = UserKYC.objects(status__in=[0,1]).order_by("-id")
            for each_user_kyc in users_kyc_queryset:
                kycStatusList = []
                kycStatusList = [
                each_user_kyc.panStatus,
                each_user_kyc.aadharStatus,
                each_user_kyc.bankStatus,
                each_user_kyc.videoVerificationStatus,
                each_user_kyc.agreementVerificationStatus
                ]
                if each_user_kyc.userId.entityTypeId!=None and each_user_kyc.userId.entityTypeId.isIndividual==False:
                    kycStatusList.append(each_user_kyc.shopVideoStatus)
                    kycStatusList.append(each_user_kyc.businessStatus)
                    if each_user_kyc.documentsList==[]:
                        kycStatusList.append('Pending')
                    else:
                        for each_document in each_user_kyc.documentsList:
                            kycStatusList.append(each_document.get('documentStatus'))

                    if each_user_kyc.shopImagesList==[]:
                        kycStatusList.append('Pending')
                    else:
                        for each_simg in each_user_kyc.shopImagesList:
                            kycStatusList.append(each_simg.get('shopImageStatus'))

                if "Rejected" in kycStatusList:
                    rejected_count += 1
                elif "Pending" in kycStatusList:
                    pending_count += 1
                elif "Submitted" in kycStatusList:
                    submitted_count += 1
                else:
                    approved_count += 1

            print(rejected_count,"(((((((((((rejected_count)))))))))))")
            print(pending_count,"(((((((((((pending_count)))))))))))")
            print(submitted_count,"(((((((((((submitted_count)))))))))))")
            print(approved_count,"(((((((((((approved_count)))))))))))")
            rejected_count = rejected_count
            pending_count = pending_count
            submitted_count=submitted_count
            approved_count=approved_count

            return render_template("super_admin_templates/user_managements_list.html",
                pagination=pagination,
                merchantName=merchantName,
                merchantEmail=merchantEmail,
                merchantPhone=merchantPhone,
                merchantId=merchantId,
                subCategorysList=subCategorysList,
                categorysList=categorysList,
                statesList=statesList,
                citiesList=citiesList,
                blocksList=blocksList,
                pincodesList=pincodesList,
                tenantslList=tenantslList,
                usersList=usersList,
                userEntityList=userEntityList,
                allUsersCommissionsList=allUsersCommissionsList,
                patternsList=patternsList,
                masterIfscBanksList=masterIfscBanksList,
                merchantDashboardUrl=merchantDashboardUrl,
                commissionsList=commissionsList,
                rejected_count = rejected_count,
                pending_count = pending_count,
                submitted_count=submitted_count,
                approved_count=approved_count,
                blocked_merchants_count=blocked_merchants_count,
                locked_merchants_count=locked_merchants_count,
                total_merchants_count=total_merchants_count
                )
        else:
            flash("Staff member does not have given view merchants permissions!!")
            # return render_template("super_admin_templates/user_managements_list.html")
            return redirect(url_for("admin.dashboard"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetched manage user data!!"
        return render_template("super_admin_templates/user_managements_list.html", 
            error=error,
            pagination=pagination,
            merchantName=merchantName,
            merchantEmail=merchantEmail,
            merchantPhone=merchantPhone,
            merchantId=merchantId,
            subCategorysList=subCategorysList,
            categorysList=categorysList,
            statesList=statesList,
            citiesList=citiesList,
            blocksList=blocksList,
            pincodesList=pincodesList,
            tenantslList=tenantslList,
            usersList=usersList,
            userEntityList=userEntityList,
            allUsersCommissionsList=allUsersCommissionsList,
            patternsList=patternsList,
            merchantDashboardUrl=merchantDashboardUrl,
            masterIfscBanksList=masterIfscBanksList,
            commissionsList=commissionsList,
            rejected_count = rejected_count,
            pending_count = pending_count,
            submitted_count=submitted_count,
            approved_count=approved_count,
            blocked_merchants_count=blocked_merchants_count,
            locked_merchants_count=locked_merchants_count,
            total_merchants_count=total_merchants_count
            )
        
def fetching_user_entity_details(user_entity_queryset):
    userEntityDict = {}
    try:
        userEntityDict={
        "id":str(user_entity_queryset.id),
        "entityType":user_entity_queryset.entityType,
        "isIndividual":user_entity_queryset.isIndividual,
        }
        if user_entity_queryset.status==1:
            userEntityDict["actionText"] = "Active"
        else:
            userEntityDict["actionText"] = "Deactive"
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userEntityDict

def fetching_user_type_details(user_type_queryset):
    userTypeDict = {}
    try:
        userTypeDict={
        "id":str(user_type_queryset.id),
        "userType":user_type_queryset.userType,
        "code":user_type_queryset.code,
        "description":user_type_queryset.description,
        "rank":user_type_queryset.rank,
        "isAllow":user_type_queryset.isAllow,
        "isCommission":user_type_queryset.isCommission,
        "isUser":user_type_queryset.isUser
        }
        if user_type_queryset.status==1:
            userTypeDict["actionText"] = "Active"
        else:
            userTypeDict["actionText"] = "Deactive"
        if user_type_queryset.createdOn:
            userTypeDict["createdOn"] = user_type_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            userTypeDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return userTypeDict


@user_managements.route("/update_user_kyc_status",methods=["POST","GET"])
def update_user_kyc_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        userAgent = request.headers.get("User-Agent")
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    userKycId = request.args.get("userKycId","")
    remark = request.form.get("remark")

    if userKycId:
        try:
            user_kyc_queryset = UserKYC.objects(id=userKycId,status__nin=[2]).first()
            existing_record = user_kyc_queryset.to_json()
            requestData = [existing_record]
            if user_kyc_queryset:
                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                if user_kyc_queryset.status == 0:
                    user_kyc_queryset.update(status=1)
                    flash("User KYC approved successfully!")
                    message=admin_queryset.userName+" "+user_kyc_queryset.userId.fullName+" User KYC activated successfully!"
                elif user_kyc_queryset.status == 1:
                    user_kyc_queryset.update(status=0)
                    flash("User KYC status set to pending successfully!")
                    message=admin_queryset.userName+" "+user_kyc_queryset.userId.fullName+" User KYC deactivated successfully!"
                save_remarks_data=save_admin_remarks_data(userKycId,adminId,remark,"merchantKyc")
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_user_kyc_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("user_managements.pending_users_list"))
            else:
                flash("Invaild user KYC id!!")
                return redirect(url_for("user_managements.pending_users_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("user_managements.pending_users_list"))
    else:
        return redirect(url_for("user_managements.pending_users_list"))


@user_managements.route("/single_view_user", methods=["POST", "GET"])
def single_view_user():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
    if "view" in permissionsList:
        try:
            userId = request.args.get("userId", "")
            if request.method == "POST":
                userId = request.form.get("userId", "")

            user_queryset = Users.objects(id=userId, status__in=[0,1]).first()
            if not user_queryset:
                flash("Invalid user id!!")
                return redirect(url_for("user_managements.manage_users_list"))

            userDict = fetching_user_details(user_queryset)
            isIndividual = True
            try:
                if (user_queryset.entityTypeId == None) or (user_queryset.entityTypeId.isIndividual == True):
                    isIndividual = True
                else:
                    isIndividual = False
            except Exception as e:
                isIndividual = True
                
            return render_template("super_admin_templates/single_view_user_details.html",userDict=userDict,isIndividual=isIndividual)

        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch user data!!"
            return redirect(url_for("user_managements.manage_users_list"))
    else:
        flash("Staff member does not have given view merchant details permissions!!")
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/update_user_status",methods=["POST","GET"])
def update_user_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        userAgent = request.headers.get("User-Agent")
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    userId = request.args.get("userId","")
    remark = request.form.get("remark","")

    if userId and remark:
        try:
            user_queryset = Users.objects(id=userId,status__nin=[2]).first()
            existing_record = user_queryset.to_json()
            requestData = [existing_record]
            if user_queryset:
                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                if user_queryset.status == 0:
                    user_queryset.update(status=1)
                    flash("User approved successfully!")
                    message=admin_queryset.userName+" "+user_queryset.fullName+" User approved successfully!"
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                elif user_queryset.status == 1:
                    user_queryset.update(status=0)
                    flash("User status set to pending successfully!")
                    message=admin_queryset.userName+" "+user_queryset.fullName+" User status set to pending successfully!"
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("user_managements.manage_users_list"))
            else:
                flash("Invaild user id!!")
                return redirect(url_for("user_managements.manage_users_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("user_managements.manage_users_list"))
    else:
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/delete_user",methods=["GET","POST"])
def delete_user():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        existing_record = ""
        updatedrequestData = [jsonData]
        remark = request.form.get("remark","")
        permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
        if "delete" in permissionsList:
            userId = request.args.get("userId","")
            user_queryset = Users.objects(id=userId,status__in=[0,1]).first()
            existing_record = user_queryset.to_json()
            requestData = [existing_record]
            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
            user_queryset.update(status=2)
            flash("User deleted successfully!")
            message=admin_queryset.userName+" "+user_queryset.fullName+" User deleted successfully!"
            save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_user","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
            return redirect(url_for("user_managements.manage_users_list"))
        else:
            flash("Staff member does not have given delete user permissions!!")
            return redirect(url_for("user_managements.manage_users_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete user!!")
        return redirect(url_for("user_managements.manage_users_list"))


@user_managements.route("/user_update",methods=["POST","GET"])
def user_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        browser=""
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()

        redirectTo = request.args.get("redirectTo","")
        if redirectTo :
            redirectval=redirectTo
        else :
            redirectval ="personalDetails"

        permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
        if "edit" in permissionsList:

            userId = request.args.get("userId","")
            print(userId,"(((((UPDATE MERCHANT)))))")
            if request.method == "GET":
                statesList = []
                userEntityList = []
                citiesList = []
                blocksList = []
                pincodesList = []
                profilelList = []
                tenantslList = []
                patternsList = []
                categorysList = []
                subCategorysList = []
                masterIfscBanksList = []
                userDict = {}

                user_queryset = Users.objects(id=userId,status__in=[0,1]).first()

                if not user_queryset:
                    flash("Invalid merchant id!!")
                    return redirect(url_for("user_managements.manage_users_list"))

                userDict = fetching_user_details(user_queryset)

                isIndividual = True
                try:
                    if (user_queryset.entityTypeId == None) or (user_queryset.entityTypeId.isIndividual == True):
                        isIndividual = True
                    else:
                        isIndividual = False
                except Exception as e:
                    isIndividual = True

                print(isIndividual,"(((((((((((isIndividual)))))))))))")

                user_entities_queryset = UserEntity.objects(status__in=[1]).order_by("-id")

                for each_user_entity in user_entities_queryset:
                    userEntityDict = fetching_user_entity_details(each_user_entity)
                    userEntityList.append(userEntityDict)

                states_queryset = States.objects(status__in=[1]).order_by("stateName")
                for each_state in states_queryset:
                    state_dict = fetching_states_details(each_state)
                    statesList.append(state_dict)

                cities_queryset = Cities.objects(status__in=[1],stateId=str(user_queryset.stateId.id)).order_by("cityName")
                for each_city in cities_queryset:
                    city_dict = fetching_cities_details(each_city)
                    citiesList.append(city_dict)

                blocks_queryset = BlocksPos.objects(status__in=[1],cityId=str(user_queryset.cityId.id)).order_by("-id")
                for each_block in blocks_queryset:
                    block_dict = fetching_blocks_details(each_block)
                    blocksList.append(block_dict)

                pincodes_queryset = Pincodes.objects(status__in=[1],blockPoId=str(user_queryset.blockPoId.id)).order_by("-id")
                for each_pincode in pincodes_queryset:
                    pincode_dict = fetching_pincode_details(each_pincode)
                    pincodesList.append(pincode_dict)


                patterns_queryset = Patterns.objects(status__in=[0,1]).order_by("-id").all()
                for each_pattern in patterns_queryset:
                    pattern_dict = fetching_pattern_details(each_pattern)
                    patternsList.append(pattern_dict)

                sub_merchant_categorys_queryset = MerchantSubCategories.objects(status__in=[0,1]).order_by("-id").all()
                for each_sub_merchant_category in sub_merchant_categorys_queryset:
                    sub_merchant_category_dict = fetching_sub_merchant_category_details(each_sub_merchant_category)
                    subCategorysList.append(sub_merchant_category_dict)


                merchant_categorys_queryset = MerchantCategories.objects(status__in=[0,1]).order_by("-id").all()
                for each_merchant_category in merchant_categorys_queryset:
                    merchant_category_dict = fetching_merchant_category_details(each_merchant_category)
                    categorysList.append(merchant_category_dict)

                master_ifsc_banks_queryset = MasterIFSCBank.objects(status__in=[0,1]).order_by("-id").all()
                for each_master_ifsc_bank in master_ifsc_banks_queryset:
                    master_ifsc_bank_dict = fetching_master_ifsc_bank_details(each_master_ifsc_bank)
                    masterIfscBanksList.append(master_ifsc_bank_dict)


                return render_template("super_admin_templates/update_user_details.html",
                    userDict=userDict,
                    isIndividual=isIndividual,
                    categorysList=categorysList,
                    subCategorysList=subCategorysList,
                    patternsList=patternsList,
                    masterIfscBanksList=masterIfscBanksList,
                    tenantslList=tenantslList,
                    pincodesList=pincodesList,blocksList=blocksList,
                    citiesList=citiesList,statesList=statesList,
                    userEntityList=userEntityList,
                    redirectval=redirectval
                    )

            if request.method == "POST":
                action = request.form.get("action", "HI").strip()
                data = request.form.to_dict()
                # Step 1: Handle OTP Generation
                if action == "generate":
                    mail_type = data.get("mailType", "").strip()
                    print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                    if not mail_type:
                        return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                    return jsonify(generate_otp_helper(mail_type))

                # tep 2: Handle OTP Verification
                elif action == "verify":
                    otp_check_id = request.form.get("otpCheckId","SAI")
                    otp_code = request.form.get("otpCode","K")

                    print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                    print(otp_code,"((((((((OTP CODE????????????))))))))")

                    if not otp_check_id or not otp_code:
                        return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                    return jsonify(verify_otp_helper(otp_check_id, otp_code))
                    
                elif action == "update":
                    otp_check_id = request.form.get("otpCheckId", "")
                    otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                    admin_id = request.form.get("adminId", "")

                    otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
                   
                    if not otpcheck_queryset:
                        return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                    # Update OTP status to 2 after verification
                    otpcheck_queryset.update(status=2)
                    return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

                fullName = request.form.get("fullName","")
                phoneNumber = request.form.get("phoneNumber","")
                email = request.form.get("email","")
                address = request.form.get("address","")
                patternId = request.form.get("patternId","")
                entityTypeId = request.form.get("entityTypeId","")
                stateId = request.form.get("stateId","")
                cityId = request.form.get("cityId","")
                blockPoId = request.form.get("blockPoId","")
                pincodeId = request.form.get("pincodeId","")
                businessName = request.form.get("businessName","")
                businessAddress = request.form.get("businessAddress","")
                businessRemark = request.form.get("businessRemark","")
                documentRemark = request.form.get("documentRemark","")
                videoVerificationRemark = request.form.get("videoVerificationRemark","")
                businessStatus = request.form.get("businessStatus","")
                shopVideoStatus = request.form.get("shopVideoStatus","")
                shopRemark = request.form.get("shopRemark","")
                parentId = request.form.get("parentId","")
                # categoryId = request.form.get("categoryId","")
                # subCategoryId = request.form.get("subCategoryId","")
                merchantType = request.form.get("merchantType","")
                maxPayinLimit = request.form.get("maxPayinLimit")
                maxPayoutLimit = request.form.get("maxPayoutLimit")
                remark = request.form.get("remark")
                jsonData = request.form.to_dict(flat=True)

                try:
                    existing_record = ""
                    user_queryset = Users.objects(id=userId, status__in=[0,1]).first()
                    existing_record = user_queryset.to_json()
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    message=admin_queryset.userName+" "+fullName+" User updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"user_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                    if not user_queryset:
                        flash("Invalid user id!!")
                        return redirect(url_for("user_managements.manage_users_list"))
                    if fullName:
                        user_queryset.update(fullName=fullName)
                    if phoneNumber:
                        user_queryset.update(phoneNumber=phoneNumber)
                    if email:
                        user_queryset.update(email=email)
                    if address:
                        user_queryset.update(address=address)
                    if merchantType:
                        user_queryset.update(merchantType=merchantType)
                    if patternId:
                        user_queryset.update(patternId = ObjectId(patternId))
                    if entityTypeId:
                        user_queryset.update(entityTypeId = ObjectId(entityTypeId))
                    if stateId:
                        user_queryset.update(stateId = ObjectId(stateId))
                    if cityId:
                        user_queryset.update(cityId = ObjectId(cityId))
                    if blockPoId:
                        user_queryset.update(blockPoId = ObjectId(blockPoId))
                    if pincodeId:
                        user_queryset.update(pincodeId = ObjectId(pincodeId))
                    if parentId:
                        user_queryset.update(parentId = ObjectId(parentId))
                    # if categoryId:
                    #     user_queryset.update(categoryId = ObjectId(categoryId))
                    # if subCategoryId:
                    #     user_queryset.update(subCategoryId = ObjectId(subCategoryId))
                    if maxPayinLimit:
                        user_queryset.update(maxPayinLimit=maxPayinLimit)
                    if maxPayoutLimit:
                        user_queryset.update(maxPayoutLimit=maxPayoutLimit)
                    

                    if userId:
                        panName = request.form.get("panName","")
                        panNumber = request.form.get("panNumber","")
                        panStatus = request.form.get("panStatus","")
                        panDocument = request.files.get("panDocument","")
                        bankId = request.form.get("bankId","")
                        bankAccountNumber = request.form.get("bankAccountNumber","")
                        bankStatus = request.form.get("bankStatus","")
                        ifscCode = request.form.get("ifscCode","")
                        aadharName = request.form.get("aadharName","")
                        aadharNumber = request.form.get("aadharNumber","")
                        aadharStatus = request.form.get("aadharStatus","")
                        aadharDocument = request.files.get("aadharDocument","")
                        aadharBackDocument = request.files.get("aadharBackDocument","")
                        uploadVideo = request.files.get("uploadVideo","")
                        videoVerificationStatus = request.form.get("videoVerificationStatus","")
                        panReason = request.form.get("panReason","")
                        bankReason = request.form.get("bankReason","")
                        aadharReason = request.form.get("aadharReason","")
                        videoVerificationReason = request.form.get("videoVerificationReason","")
                        agreementVerificationReason = request.form.get("agreementVerificationReason","")
                        agreementVerificationStatus = request.form.get("agreementVerificationStatus","")
                        remark = request.form.get("remark","")
                        shopVideoStatus = request.form.get("shopVideoStatus","")
                        shopRemark = request.form.get("shopRemark","")

                        companyRegistrationDoc = request.files.get("companyRegistrationDoc","")
                        companyRegistrationStatus = request.form.get("companyRegistrationStatus","")
                        moaDoc = request.files.get("moaDoc","")
                        moaStatus = request.form.get("moaStatus","")
                        aoaDoc = request.files.get("aoaDoc","")
                        aoaStatus = request.form.get("aoaStatus","")
                        companyPanDoc = request.files.get("companyPanDoc","")
                        companyPanStatus = request.form.get("companyPanStatus","")

                        directorName = request.form.getlist("directorName[]")
                        directorPanName = request.form.getlist("directorPanName[]")
                        directorPanNumber = request.form.getlist("directorPanNumber[]")
                        directorPanStatus = request.form.getlist("directorPanStatus[]")
                        directorPanImage = request.form.getlist("directorPanImage[]")
                        directorAadharName = request.form.getlist("directorAadharName[]")
                        directorAadharNumber = request.form.getlist("directorAadharNumber[]")
                        directorAadharStatus = request.form.getlist("directorAadharStatus[]")
                        directorAadharImage = request.form.getlist("directorAadharImage[]")

                        boardOfDirectors = [
                            {
                                "directorName": directorName,
                                "directorPanName": directorPanName,
                                "directorPanNumber": directorPanNumber,
                                "directorPanStatus": directorPanStatus,
                                "directorPanImage": directorPanImage,
                                "directorAadharName": directorAadharName,
                                "directorAadharNumber": directorAadharNumber,
                                "directorAadharStatus": directorAadharStatus,
                                "directorAadharImage": directorAadharImage
                            } 
                            for directorName, directorPanName, directorPanNumber, directorPanStatus, directorPanImage, directorAadharName, directorAadharNumber, directorAadharStatus, directorAadharImage 
                            in zip(directorName, directorPanName, directorPanNumber, directorPanStatus, directorPanImage, directorAadharName, directorAadharNumber, directorAadharStatus, directorAadharImage)
                        ]

                        print(boardOfDirectors, "((((((((((((((((boardOfDirectors))))))))))))))))")

                        user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
                        if user_kyc_queryset:
                            save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,remark,"merchantKyc")
                            if panName:
                                user_kyc_queryset.update(panName=panName)
                            if panNumber:
                                user_kyc_queryset.update(panNumber=panNumber)
                            if panStatus:
                                user_kyc_queryset.update(panStatus=panStatus)
                            if bankId:
                                user_kyc_queryset.update(bankId=ObjectId(bankId))
                            if bankAccountNumber:
                                user_kyc_queryset.update(bankAccountNumber=bankAccountNumber)
                            if bankStatus:
                                user_kyc_queryset.update(bankStatus=bankStatus)
                            if businessName:
                                user_kyc_queryset.update(businessName=businessName)
                            if businessAddress:
                                user_kyc_queryset.update(businessAddress=businessAddress)
                            if businessRemark:
                                user_kyc_queryset.update(businessRemark=businessRemark)

                            if documentRemark:
                                user_kyc_queryset.update(documentRemark=documentRemark)

                            if videoVerificationRemark:
                                user_kyc_queryset.update(videoVerificationRemark=videoVerificationRemark)

                            if businessStatus:
                                user_kyc_queryset.update(businessStatus=businessStatus)
                            if aadharName:
                                user_kyc_queryset.update(aadharName=aadharName)
                            if ifscCode:
                                user_kyc_queryset.update(ifscCode=ifscCode)
                            if aadharNumber:
                                user_kyc_queryset.update(aadharNumber=aadharNumber)
                            if aadharStatus:
                                user_kyc_queryset.update(aadharStatus=aadharStatus)
                            if videoVerificationStatus:
                                user_kyc_queryset.update(videoVerificationStatus=videoVerificationStatus)
                            if panReason:
                                user_kyc_queryset.update(panReason=panReason)
                                save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,panReason,"merchantKyc")
                            if bankReason:
                                user_kyc_queryset.update(bankReason=bankReason)
                                save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,bankReason,"merchantKyc")
                            if aadharReason:
                                user_kyc_queryset.update(aadharReason=aadharReason)
                                save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,aadharReason,"merchantKyc")
                            if videoVerificationReason:
                                user_kyc_queryset.update(videoVerificationReason=videoVerificationReason)
                                save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,videoVerificationReason,"merchantKyc")
                            if agreementVerificationReason:
                                user_kyc_queryset.update(agreementVerificationReason=agreementVerificationReason)
                                save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,agreementVerificationReason,"merchantKyc")
                            if agreementVerificationStatus:
                                user_kyc_queryset.update(agreementVerificationStatus=agreementVerificationStatus)

                            if companyRegistrationStatus:
                                user_kyc_queryset.update(companyRegistrationStatus=companyRegistrationStatus)

                            if moaStatus:
                                user_kyc_queryset.update(moaStatus=moaStatus)

                            if aoaStatus:
                                user_kyc_queryset.update(aoaStatus=aoaStatus)

                            if companyPanStatus:
                                user_kyc_queryset.update(companyPanStatus=companyPanStatus)

                            if shopVideoStatus:
                                if shopVideoStatus == "Rejected":
                                    user_kyc_queryset.update(shopVideo=None)
                                user_kyc_queryset.update(shopVideoStatus=shopVideoStatus)

                            if shopRemark:
                                user_kyc_queryset.update(shopRemark=shopRemark)

                            if companyRegistrationDoc:
                                randomNumber = str(random_digit_generate(6))
                                pdfFile = upload_pdf_file("companyRegistrationDocs", randomNumber, ".pdf", companyRegistrationDoc)
                                if pdfFile:
                                    user_kyc_queryset.update(companyRegistrationDoc=pdfFile)

                            if moaDoc:
                                randomNumber = str(random_digit_generate(6))
                                pdfFile = upload_pdf_file("moaDocs", randomNumber, ".pdf", moaDoc)
                                if pdfFile:
                                    user_kyc_queryset.update(moaDoc=pdfFile)


                            if aoaDoc:
                                randomNumber = str(random_digit_generate(6))
                                pdfFile = upload_pdf_file("aoaDocs", randomNumber, ".pdf", aoaDoc)
                                if pdfFile:
                                    user_kyc_queryset.update(aoaDoc=pdfFile)

                            if companyPanDoc:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"))
                                save_file = companyPanDoc.save(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"+str(randomNumber)+".png"))
                                user_kyc_queryset.update(companyPanDoc="media/companyPanDocs/"+str(randomNumber)+".png")

                            if panDocument:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"))
                                save_file = panDocument.save(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"+str(randomNumber)+".png"))
                                user_kyc_queryset.update(panDocument="media/panDocuments/"+str(randomNumber)+".png")

                            if aadharDocument:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
                                save_file = aadharDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(randomNumber)+".png"))
                                user_kyc_queryset.update(aadharDocument="media/aadharDocuments/"+str(randomNumber)+".png")

                            if aadharBackDocument:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
                                save_file = aadharBackDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(randomNumber)+".png"))
                                user_kyc_queryset.update(aadharBackDocument="media/aadharDocuments/"+str(randomNumber)+".png")
                        
                            if uploadVideo:
                                randomNumber = str(random_digit_generate(6))
                                video_file = upload_file_video("uploadKYCVideos", str(randomNumber), ".mp4", uploadVideo)
                                if video_file:
                                    user_kyc_queryset.update(uploadVideo=video_file)
                        else:
                            user_kyc_table = UserKYC(
                                userId=userId,
                                panName = panName,
                                panNumber  = panNumber,
                                panStatus  = panStatus,
                                bankId  = bankId,
                                bankAccountNumber  = bankAccountNumber,
                                bankStatus  = bankStatus,
                                ifscCode  = ifscCode,
                                aadharName  = aadharName,
                                aadharNumber  = aadharNumber,
                                aadharStatus  = aadharStatus,
                                videoVerificationStatus  = videoVerificationStatus,
                                panReason = panReason,
                                bankReason = bankReason,
                                aadharReason = aadharReason,
                                videoVerificationReason = videoVerificationReason,
                                agreementVerificationReason=agreementVerificationReason,
                                agreementVerificationStatus = agreementVerificationStatus,
                                companyRegistrationStatus = companyRegistrationStatus,
                                moaStatus = moaStatus,
                                aoaStatus = aoaStatus,
                                businessName = businessName,
                                businessAddress = businessAddress,
                                businessRemark = businessRemark,
                                documentRemark=documentRemark,
                                videoVerificationRemark=videoVerificationRemark,
                                businessStatus = businessStatus,
                                companyPanStatus = companyPanStatus,
                                shopVideoStatus = shopVideoStatus,
                                shopRemark = shopRemark,
                                createdOn =datetime.datetime.now(),
                                status = 1
                                )
                            save_table = user_kyc_table.save()

                            if panReason:
                                save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,panReason,"merchantKyc")
                            if bankReason:
                                save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,bankReason,"merchantKyc")
                            if aadharReason:
                                save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,aadharReason,"merchantKyc")
                            if videoVerificationReason:
                                save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,videoVerificationReason,"merchantKyc")
                            if agreementVerificationReason:
                                save_remarks_data=save_admin_remarks_data(str(save_table.id),adminId,agreementVerificationReason,"merchantKyc")

                            if panDocument:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"))
                                save_file = panDocument.save(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"+str(get_epoch_milli_time())+".png"))
                                save_table.update(panDocument="media/panDocuments/"+str(get_epoch_milli_time())+".png")

                            if aadharDocument:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
                                save_file = aadharDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(get_epoch_milli_time())+".png"))
                                save_table.update(aadharDocument="media/aadharDocuments/"+str(get_epoch_milli_time())+".png")

                            if aadharBackDocument:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
                                save_file = aadharBackDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(get_epoch_milli_time())+".png"))
                                save_table.update(aadharBackDocument="media/aadharDocuments/"+str(get_epoch_milli_time())+".png")
                            if uploadVideo:
                                video_file = upload_file_video("uploadKYCVideos", str(get_epoch_milli_time()), ".mp4", uploadVideo)
                                if video_file:
                                    save_table.update(uploadVideo=video_file)

                            if companyRegistrationDoc:
                                randomNumber = str(random_digit_generate(6))
                                pdfFile = upload_pdf_file("companyRegistrationDocs", randomNumber, ".pdf", companyRegistrationDoc)
                                if pdfFile:
                                    save_table.update(companyRegistrationDoc=pdfFile)

                            if moaDoc:
                                randomNumber = str(random_digit_generate(6))
                                pdfFile = upload_pdf_file("moaDocs", randomNumber, ".pdf", moaDoc)
                                if pdfFile:
                                    save_table.update(moaDoc=pdfFile)


                            if aoaDoc:
                                randomNumber = str(random_digit_generate(6))
                                pdfFile = upload_pdf_file("aoaDocs", randomNumber, ".pdf", aoaDoc)
                                if pdfFile:
                                    save_table.update(aoaDoc=pdfFile)

                            if companyPanDoc:
                                randomNumber = str(random_digit_generate(6))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"))
                                save_file = companyPanDoc.save(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"+str(randomNumber)+".png"))
                                save_table.update(companyPanDoc="media/companyPanDocs/"+str(randomNumber)+".png")

                    flash("Merchant details updated successfully!")
                    return redirect(url_for("user_managements.user_update",userId=userId,redirectTo=redirectval))
                except Exception as e:
                    flash("Unable to update merchant details!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("user_managements.manage_users_list"))
                # else:
                #     flash("Required fields are missing!!")
                #     return redirect(url_for("user_managements.manage_users_list"))
        else:
            flash("Staff member does not have given update user permissions!!")
            return redirect(url_for("user_managements.manage_users_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update merchant details!!"
        return render_template("super_admin_templates/user_managements_list.html",error=error)



@user_managements.route("/pending_users_list", methods=["POST", "GET"])
def pending_users_list():
    pagination = None  # Initialize pagination at the start
    userKycList = []   # Initialize userKycList at the start
    start=0
    try:
        print(request.headers,"request.headers")
        if not session.get("adminId"):
            return redirect("admin_login")
        
        permissionsList = check_permissions(session.get("adminId"), "pendingKYCUsersPermissions")
        if "view" in permissionsList:
            adminId = session.get("adminId")
            

            merchantEmail = request.form.get('merchantEmail', '')
            merchantName = request.form.get('merchantName', '')
            merchantPhone = request.form.get('merchantPhone', '')
            merchantId = request.form.get('merchantId', '')
            
            page = request.args.get(get_page_parameter(), type=int, default=1)
            per_page = 20
            start = (page - 1) * per_page
            snoCount = int(start)
            users_queryset = Users.objects(status__ne=2)

            kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
            trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

            print(kycUsersList, "(((((kycUsersList)))))")
            print(trueUsersList, "(((((trueUsersList)))))")

            # Base query for UserKYC
            user_kycs_queryset = UserKYC.objects(status__nin=[2]).order_by("-submittedDate")

             
            user_kycs_queryset = user_kycs_queryset.filter(
                (Q(userId__in=kycUsersList) & (Q(documentsList=[]) | Q(shopImagesList=[]) | Q(documentsList=None) | Q(shopImagesList=None) | Q(shopImagesList__elemMatch={"shopImageStatus": {"$ne": "Approved"}}) | Q(documentsList__elemMatch={"documentStatus": {"$ne": "Approved"}}) | Q(businessStatus__ne="Approved")  | Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved") | Q(shopVideoStatus__ne="Approved"))) |
                (Q(userId__in=trueUsersList) & (Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved")))
            )

            if merchantName:
                user_ids = Users.objects(fullName__icontains=merchantName).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            if merchantId:
                user_ids = Users.objects(merchantUniqueNumber__icontains=merchantId).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            if merchantEmail:
                user_ids = Users.objects(email__icontains=merchantEmail).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            if merchantPhone:
                user_ids = Users.objects(phoneNumber__icontains=merchantPhone).values_list('id')
                user_kycs_queryset = user_kycs_queryset.filter(userId__in=user_ids)

            # if merchantName:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__fullName__icontains=merchantName)

            # if merchantId:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__merchantUniqueNumber__icontains=merchantId)
            # if merchantEmail:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__email__icontains=merchantEmail)   
            # if merchantPhone:
            #     user_kycs_queryset = user_kycs_queryset.filter(userId__phoneNumber__icontains=merchantPhone)

            total_count=user_kycs_queryset.count()
            limited_users=user_kycs_queryset.filter().limit(per_page).skip(start)
            
            for each_user_entity in limited_users:
                userKycDict = fetching_user_kyc_details(each_user_entity)
                snoCount += 1
                userKycDict["snoCount"] = snoCount
                userKycList.append(userKycDict)
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="UserKYC")
            
            return render_template("super_admin_templates/pending_user_list.html",
                                   pagination=pagination,
                                   merchantName=merchantName,
                                   merchantEmail=merchantEmail,
                                   merchantPhone=merchantPhone,
                                   merchantId=merchantId,
                                   userKycList=userKycList,
                                   start=start
                                   )
        else:
            flash("Staff member does not have given view pending KYC permissions!!")
            return render_template("super_admin_templates/pending_user_list.html")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch pending merchants data!!"
        return render_template("super_admin_templates/pending_user_list.html", 
            pagination=pagination,  # This will be None if the try block fails
            error=error,
            start=start,
            userKycList=userKycList  # Pass the empty list
        )

@user_managements.route("/user_kyc_update",methods=["POST","GET"])
def user_kyc_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()

        redirectTo = request.args.get("redirectTo","")
        if redirectTo :
            redirectval=redirectTo
        else :
            redirectval ="personalDetails"

        permissionsList = check_permissions(session.get("adminId"),"pendingKYCUsersPermissions")
        if "edit" in permissionsList:
            userKycId = request.args.get("userKycId","")
            print(userKycId,"userKycId")
            if request.method == "GET":
                statesList = []
                userEntityList = []
                citiesList = []
                blocksList = []
                pincodesList = []
                profilelList = []
                tenantslList = []
                masterIfscBanksList = []
                userKycDict = {}

                user_kyc_queryset = UserKYC.objects(id=userKycId, status__nin=[2,3]).first()
                if not user_kyc_queryset:
                    flash("Invalid merchant kyc id!!")
                    return redirect(url_for("user_managements.pending_users_list"))


                master_ifsc_banks_queryset = MasterIFSCBank.objects(status__in=[0,1]).order_by("-id").all()
                for each_master_ifsc_bank in master_ifsc_banks_queryset:
                    master_ifsc_bank_dict = fetching_master_ifsc_bank_details(each_master_ifsc_bank)
                    masterIfscBanksList.append(master_ifsc_bank_dict)

                userKycDict = fetching_user_kyc_details(user_kyc_queryset)

                try:
                    if user_kyc_queryset.userId.agreementDocument:
                        userKycDict["agreementDocument"]=domain+user_kyc_queryset.userId.agreementDocument
                    else:
                        userKycDict["agreementDocument"]=""
                except Exception as e:
                    userKycDict["agreementDocument"]=""
                
                # try:
                #     if user_kyc_queryset.documentsList:
                #         userKycDict["documentsList"] =user_kyc_queryset.documentsList
                #     else:
                #         userKycDict["documentsList"] = []
                # except Exception as e:
                #     userKycDict["documentsList"] = []


                # # print(userKycDict["documentsList"],"DOCUMENT LIST FOR API")

                # try:
                #     if user_kyc_queryset.userId.shopImagesList:
                #         userKycDict["shopImagesList"] =user_kyc_queryset.userId.shopImagesList
                #     else:
                #         userKycDict["shopImagesList"] = []
                # except Exception as e:
                #     userKycDict["shopImagesList"] = []
                
                userKycDict["businessName"] = user_kyc_queryset.businessName
                userKycDict["businessAddress"] = user_kyc_queryset.businessAddress
                userKycDict["businessRemark"] = user_kyc_queryset.businessRemark
                userKycDict["businessStatus"] = user_kyc_queryset.businessStatus
                userKycDict["documentRemark"] = user_kyc_queryset.documentRemark
                userKycDict["videoVerificationRemark"] = user_kyc_queryset.videoVerificationRemark
                
                userKycDict["shopVideo"] = user_kyc_queryset.shopVideo
                userKycDict["shopImagesList"] = user_kyc_queryset.shopImagesList
                userKycDict["documentsList"] = user_kyc_queryset.documentsList
                userKycDict["shopRemark"] = user_kyc_queryset.shopRemark
                userKycDict["agreementVerificationReason"] = user_kyc_queryset.agreementVerificationReason


                isIndividual = True
                try:
                    if (user_kyc_queryset.userId.entityTypeId == None) or  (user_kyc_queryset.userId.entityTypeId.isIndividual == True):
                        isIndividual = True
                    else:
                        isIndividual = False
                except Exception as e:
                    isIndividual = True
                return render_template("super_admin_templates/update_user_kyc_details.html",
                    userKycDict=userKycDict,masterIfscBanksList=masterIfscBanksList,isIndividual=isIndividual,redirectval=redirectval
                    )

            if request.method == "POST":
                action = request.form.get("action", "HI").strip()
                data = request.form.to_dict()
                # Step 1: Handle OTP Generation
                if action == "generate":
                    mail_type = data.get("mailType", "").strip()
                    print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                    if not mail_type:
                        return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                    return jsonify(generate_otp_helper(mail_type))

                # tep 2: Handle OTP Verification
                elif action == "verify":
                    otp_check_id = request.form.get("otpCheckId","SAI")
                    otp_code = request.form.get("otpCode","K")

                    print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                    print(otp_code,"((((((((OTP CODE????????????))))))))")

                    if not otp_check_id or not otp_code:
                        return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                    return jsonify(verify_otp_helper(otp_check_id, otp_code))

                elif action == "update":
                    otp_check_id = request.form.get("otpCheckId", "")
                    otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                    admin_id = request.form.get("adminId", "")

                    otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
                   
                    if not otpcheck_queryset:
                        return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                    # Update OTP status to 2 after verification
                    otpcheck_queryset.update(status=2)
                    return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

                fullName = request.form.get("fullName","")
                phoneNumber = request.form.get("phoneNumber","")
                email = request.form.get("email","")
                address = request.form.get("address","")
                panStatus = request.form.get("panStatus","")
                panDocument = request.files.get("panDocument","")
                bankStatus = request.form.get("bankStatus","")
                aadharStatus = request.form.get("aadharStatus","")
                aadharDocument = request.files.get("aadharDocument","")
                aadharBackDocument = request.files.get("aadharBackDocument","")
                uploadVideo = request.files.get("uploadVideo","")
                shopVideo = request.files.get("shopVideo","")
                print(shopVideo,"shopVideo")
                videoVerificationStatus = request.form.get("videoVerificationStatus","")
                panReason = request.form.get("panReason","")
                bankReason = request.form.get("bankReason","")
                aadharReason = request.form.get("aadharReason","")
                videoVerificationReason = request.form.get("videoVerificationReason","")
                agreementVerificationReason = request.form.get("agreementVerificationReason","")
                agreementVerificationStatus = request.form.get("agreementVerificationStatus","")
                companyRegistrationDoc = request.files.get("companyRegistrationDoc","")
                companyRegistrationStatus = request.files.get("companyRegistrationStatus","")
                moaDoc = request.files.get("moaDoc","")
                moaStatus = request.files.get("moaStatus","")
                aoaDoc = request.files.get("aoaDoc","")
                aoaStatus = request.files.get("aoaStatus","")
                companyPanDoc = request.files.get("companyPanDoc","")
                companyPanStatus = request.files.get("companyPanStatus","")
                remark = request.form.get("remark","")
                businessStatus = request.form.get("businessStatus","")
                shopVideoStatus = request.form.get("shopVideoStatus","")
                documentRemark = request.form.get("documentRemark","")
                videoVerificationRemark = request.form.get("videoVerificationRemark","")
                businessRemark = request.form.get("businessRemark","")
                shopRemark = request.form.get("shopRemark","")
                jsonData = request.form.to_dict(flat=True)

                try:
                    existing_record = ""
                    user_kyc_queryset = UserKYC.objects(id=userKycId, status__in=[0,1]).first()
                    user_queryset = Users.objects(id=str(user_kyc_queryset.userId.id)).first()
                    userId=str(user_queryset.id)
                    existing_record = user_kyc_queryset.to_json()
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    message=admin_queryset.userName+" "+user_kyc_queryset.userId.fullName+" Merchant KYC details updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"user_kyc_update","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    save_remarks_data=save_admin_remarks_data(userKycId,adminId,remark,"merchantKyc")

                    if user_kyc_queryset:
                        if fullName:
                            user_queryset.update(fullName=fullName)
                        if phoneNumber:
                            user_queryset.update(phoneNumber=phoneNumber)
                        if email:
                            user_queryset.update(email=email)
                        if address:
                            user_queryset.update(address=address)  
                        if panStatus:
                            user_kyc_queryset.update(panStatus=panStatus)
                        if bankStatus:
                            user_kyc_queryset.update(bankStatus=bankStatus)
                        if businessStatus:
                            user_kyc_queryset.update(businessStatus=businessStatus)
                        if aadharStatus:
                            user_kyc_queryset.update(aadharStatus=aadharStatus)
                        if videoVerificationStatus:
                            user_kyc_queryset.update(videoVerificationStatus=videoVerificationStatus)
                        if panReason:
                            user_kyc_queryset.update(panReason=panReason)
                        if panReason:
                            user_kyc_queryset.update(panReason=panReason)
                            save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,panReason,"merchantKyc")
                        if bankReason:
                            user_kyc_queryset.update(bankReason=bankReason)
                            save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,bankReason,"merchantKyc")
                        if aadharReason:
                            user_kyc_queryset.update(aadharReason=aadharReason)
                            save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,aadharReason,"merchantKyc")
                        if videoVerificationReason:
                            user_kyc_queryset.update(videoVerificationReason=videoVerificationReason)
                            save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,videoVerificationReason,"merchantKyc")
                        if agreementVerificationReason:
                            user_kyc_queryset.update(agreementVerificationReason=agreementVerificationReason)
                            save_remarks_data=save_admin_remarks_data(str(user_kyc_queryset.id),adminId,agreementVerificationReason,"merchantKyc")

                        if agreementVerificationStatus:
                            user_kyc_queryset.update(agreementVerificationStatus=agreementVerificationStatus)


                        if companyRegistrationStatus:
                            user_kyc_queryset.update(companyRegistrationStatus=companyRegistrationStatus)

                        if moaStatus:
                            user_kyc_queryset.update(moaStatus=moaStatus)

                        if aoaStatus:
                            user_kyc_queryset.update(aoaStatus=aoaStatus)

                        if companyPanStatus:
                            user_kyc_queryset.update(companyPanStatus=companyPanStatus)


                        if documentRemark:
                            user_kyc_queryset.update(documentRemark=documentRemark)


                        if videoVerificationRemark:
                            user_kyc_queryset.update(videoVerificationRemark=videoVerificationRemark)

                        if shopRemark:
                            user_kyc_queryset.update(shopRemark=shopRemark)

                        print(shopVideoStatus,"((((((((((shopVideoStatus))))))))))")
                        if shopVideoStatus:
                            if shopVideoStatus == "Rejected":
                                user_kyc_queryset.update(shopVideo=None)
                            user_kyc_queryset.update(shopVideoStatus=shopVideoStatus)

                        if businessRemark:
                            user_kyc_queryset.update(businessRemark=businessRemark)

                        if remark:
                            user_kyc_queryset.update(remark=remark)


                        if panDocument:
                            randomNumber = str(random_digit_generate(6))
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"))
                            save_file = panDocument.save(os.path.join(app.config['SITE_ROOT'], "media/panDocuments/"+str(randomNumber)+".png"))
                            user_kyc_queryset.update(panDocument="media/panDocuments/"+str(randomNumber)+".png")

                        if aadharDocument:
                            aadharRandomNumber = str(random_digit_generate(6))
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
                            save_file = aadharDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(aadharRandomNumber)+".png"))
                            user_kyc_queryset.update(aadharDocument="media/aadharDocuments/"+str(aadharRandomNumber)+".png")

                        if aadharBackDocument:
                            aadharRandomNumber = str(random_digit_generate(6))
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"))
                            save_file = aadharBackDocument.save(os.path.join(app.config['SITE_ROOT'], "media/aadharDocuments/"+str(aadharRandomNumber)+".png"))
                            user_kyc_queryset.update(aadharBackDocument="media/aadharDocuments/"+str(aadharRandomNumber)+".png")


                        if companyRegistrationDoc:
                            randomNumber = str(random_digit_generate(6))
                            pdfFile = upload_pdf_file("companyRegistrationDocs", randomNumber, ".pdf", companyRegistrationDoc)
                            if pdfFile:
                                user_kyc_queryset.update(companyRegistrationDoc=pdfFile)

                        if moaDoc:
                            randomNumber = str(random_digit_generate(6))
                            pdfFile = upload_pdf_file("moaDocs", randomNumber, ".pdf", moaDoc)
                            if pdfFile:
                                user_kyc_queryset.update(moaDoc=pdfFile)


                        if aoaDoc:
                            randomNumber = str(random_digit_generate(6))
                            pdfFile = upload_pdf_file("aoaDocs", randomNumber, ".pdf", aoaDoc)
                            if pdfFile:
                                user_kyc_queryset.update(aoaDoc=pdfFile)

                        if companyPanDoc:
                            randomNumber = str(random_digit_generate(6))
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"))
                            save_file = companyPanDoc.save(os.path.join(app.config['SITE_ROOT'], "media/companyPanDocs/"+str(randomNumber)+".png"))
                            user_kyc_queryset.update(companyPanDoc="media/companyPanDocs/"+str(randomNumber)+".png")
                    
                        if uploadVideo:
                            video_file = upload_file_video("uploadKYCVideos", str(userId), ".mp4", uploadVideo)
                            if video_file:
                                user_kyc_queryset.update(uploadVideo=video_file)
                        
                        if shopVideo:
                            shop_video_file = upload_file_video("uploadBussinessVideos", str(userId), ".mp4", shopVideo)
                            print(shop_video_file,"shop_video_file")
                            if shop_video_file:
                                user_kyc_queryset.update(shopVideo=shop_video_file)
                            
                        flash("Merchant KYC details updated successfully!")
                        return redirect(url_for("user_managements.user_kyc_update",userKycId=userKycId,redirectTo=redirectval))
                except Exception as e:
                    flash("Unable to update merchant kyc details!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("user_managements.pending_users_list"))

        else:
            flash("Staff member does not have given update kyc permissions!!")
            return redirect(url_for("user_managements.pending_users_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update merchant kyc details!!"
        return render_template("super_admin_templates/pending_user_list.html",error=error)



######################## dropdown functions ########################


def fetching_cities_details(city_queryset):
    city_dict = {}
    try:
        city_dict={
        "id":str(city_queryset.id),
        "cityName":city_queryset.cityName,
        "stateName":city_queryset.stateId.stateName,
        "stateId":str(city_queryset.stateId.id)
        }
        if city_queryset.createdOn:
            city_dict["createdOn"] = city_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            city_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return city_dict



@user_managements.route("/cities_list",methods=["POST"])
def cities_list():
    print("(((((((((((((((cities_list)))))))))))))))")
    data_status = {"responseStatus":0,"result":""}
    citiesList = []
    try:
        stateId = request.form.get("stateId","")
        if not stateId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        ################# For Cities Data ##################
        cities_queryset = Cities.objects(stateId=stateId,status__in=[0,1]).order_by("-id")
        for each_city in cities_queryset:
            city_dict = fetching_cities_details(each_city)
            citiesList.append(city_dict)

        data_status["responseStatus"]=1
        data_status["result"]="Cities data fetched successfully!"
        data_status["citiesList"]=citiesList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch cities data!!"
        return data_status



def fetching_blocks_details(block_queryset):
    block_dict = {}
    try:
        block_dict={
        "id":str(block_queryset.id),
        "name":block_queryset.name,
        "cityName":block_queryset.cityId.cityName,
        "cityId":str(block_queryset.cityId.id)
        }
        if block_queryset.createdOn:
            block_dict["createdOn"] = block_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            block_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return block_dict

@user_managements.route("/block_po_list",methods=["POST"])
def block_po_list():
    data_status = {"responseStatus":0,"result":""}
    blocksList = []
    try:
        cityId = request.form.get("cityId","")
        if not cityId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        blocks_queryset = BlocksPos.objects(cityId=cityId,status__in=[1]).order_by("-id")
        for each_block in blocks_queryset:
            block_dict = fetching_blocks_details(each_block)
            blocksList.append(block_dict)

        data_status["responseStatus"]=1
        data_status["result"]="Blocks data fetched successfully!"
        data_status["blocksList"]=blocksList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch blocks data!!"
        return data_status


def fetching_pincode_details(pincode_queryset):
    pincode_dict = {}
    try:
        pincode_dict={
        "id":str(pincode_queryset.id),
        "pincode":pincode_queryset.pincode,
        "blockName":pincode_queryset.blockPoId.name,
        "blockPoId":str(pincode_queryset.blockPoId.id)
        }
        if pincode_queryset.createdOn:
            pincode_dict["createdOn"] = pincode_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            pincode_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return pincode_dict

@user_managements.route("/pincodes_list",methods=["POST"])
def pincodes_list():
    data_status = {"responseStatus":0,"result":""}
    pincodesList = []
    try:
        blockPoId = request.form.get("blockPoId","")
        if not blockPoId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        pincodes_queryset = Pincodes.objects(blockPoId=blockPoId,status__in=[1]).order_by("-id")
        for each_pincode in pincodes_queryset:
            pincode_dict = fetching_pincode_details(each_pincode)
            pincodesList.append(pincode_dict)

        data_status["responseStatus"]=1
        data_status["result"]="Pincodes data fetched successfully!"
        data_status["pincodesList"]=pincodesList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch pincodes data!!"
        return data_status

@user_managements.route("/view_parent", methods=['GET', 'POST'])
def view_parent():
    userId = request.args.get("userId","")
    parentDict = {}
    parentDropdownList = []
    user_list = []
    userName = ""
    try:
        action = request.form.get("action", "HI").strip()
        data = request.form.to_dict()
        # Step 1: Handle OTP Generation
        if action == "generate":
            mail_type = data.get("mailType", "").strip()
            print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
            if not mail_type:
                return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


            return jsonify(generate_otp_helper(mail_type))

        # tep 2: Handle OTP Verification
        elif action == "verify":
            otp_check_id = request.form.get("otpCheckId","SAI")
            otp_code = request.form.get("otpCode","K")

            print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
            print(otp_code,"((((((((OTP CODE????????????))))))))")

            if not otp_check_id or not otp_code:
                return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

            return jsonify(verify_otp_helper(otp_check_id, otp_code))

        elif action == "update":
            otp_check_id = request.form.get("otpCheckId", "")
            otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
            admin_id = request.form.get("adminId", "")

            otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
           
            if not otpcheck_queryset:
                return jsonify({"responseStatus": 0, "result": "Invalid Request."})
            # Update OTP status to 2 after verification
            otpcheck_queryset.update(status=2)
            return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})
                
        user_queryset = Users.objects(id=userId,status=1).first()
        if user_queryset:
            userName = user_queryset.fullName
        else:
            userName = ""

        if user_queryset.parentId:
            parent_queryset = Users.objects(id=str(user_queryset.parentId.id),status=1).first()
            print(parent_queryset.id)
            print("((((((((parent_queryset))))))))")
            parentDict = {
            'parentId': str(parent_queryset.id),
            'fullName': parent_queryset.fullName,
            'email': parent_queryset.email,
            'phoneNumber': parent_queryset.phoneNumber,
            }
        parents_dropdown_queryset = Users.objects(id__ne=userId,parentId__ne=userId,status=1).order_by("-id")
        for each_parent in parents_dropdown_queryset:
            dropDownDict = {
            'id': str(each_parent.id),
            'fullName': each_parent.fullName,
            }
            parentDropdownList.append(dropDownDict)
        
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return render_template('super_admin_templates/view_parent.html',parentDict=parentDict,parentDropdownList=parentDropdownList,userId=userId,userName=userName)


@user_managements.route("/assign_parent",methods=["POST","GET"])
def assign_parent():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()

        if request.method == "POST":
            userId = request.form.get("userId","")
            print(userId)
            print("(((((((userId)))))))")
            parentId = request.form.get("parentId","")
            print(parentId)
            print("((((((((((parentId))))))))))")
            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]
            remark = request.form.get("remark","")

            if userId:
                user_queryset = Users.objects(id=userId,status=1).first()
                parent_queryset = Users.objects(id=parentId,status=1).first()
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+user_queryset.fullName+" "+parent_queryset.fullName+" has been successfully assigned as a parent."
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_parent","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                        save_remarks_data=save_admin_remarks_data(parentId,adminId,remark,"assignparent") 
                    user_queryset.update(
                        parentId = ObjectId(parentId),
                        )

                    flash("Parent assigned successfully!")
                    return redirect(url_for("user_managements.view_parent",userId=userId))
                except Exception as e:
                    flash("Unable to assign parent!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("user_managements.view_parent",userId=userId))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("user_managements.view_parent",userId=userId))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to assign parent!!!"
        return render_template("super_admin_templates/view_parent.html",error=error)


@user_managements.route("/remove_parent",methods=["POST","GET"])
def remove_parent():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()

        userId = request.args.get("userId","")
        print(userId)
        print("(((((((userId)))))))")

        if request.method == "POST":
            action = request.form.get("action", "HI").strip()
            data = request.form.to_dict()
            # Step 1: Handle OTP Generation
            if action == "generate":
                mail_type = data.get("mailType", "").strip()
                print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                if not mail_type:
                    return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                return jsonify(generate_otp_helper(mail_type))

            # tep 2: Handle OTP Verification
            elif action == "verify":
                otp_check_id = request.form.get("otpCheckId","SAI")
                otp_code = request.form.get("otpCode","K")

                print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                print(otp_code,"((((((((OTP CODE????????????))))))))")

                if not otp_check_id or not otp_code:
                    return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                return jsonify(verify_otp_helper(otp_check_id, otp_code))

            elif action == "update":
                otp_check_id = request.form.get("otpCheckId", "")
                otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                admin_id = request.form.get("adminId", "")

                otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
               
                if not otpcheck_queryset:
                    return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                # Update OTP status to 2 after verification
                otpcheck_queryset.update(status=2)
                return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

            parentId = request.args.get("parentId","")
            print(parentId)
            print("((((((((((parentId))))))))))")
            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]
            remark = request.form.get("remark","")

            if userId:
                user_queryset = Users.objects(id=userId,status=1).first()
                parent_queryset = Users.objects(id=parentId,status=1).first()
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+user_queryset.fullName+" "+parent_queryset.fullName+" has been successfully removed as a parent."
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"remove_parent","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                        save_remarks_data=save_admin_remarks_data(parentId,adminId,remark,"removeParent") 
                    user_queryset.update(
                        parentId = None,
                        )

                    flash("Parent removed successfully!")
                    return redirect(url_for("user_managements.view_parent",userId=userId))
                except Exception as e:
                    flash("Unable to remove parent!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("user_managements.view_parent",userId=userId))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("user_managements.view_parent",userId=userId))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to assign parent!!!"
        return render_template("super_admin_templates/view_parent.html",error=error)

###### OLD CODE #############
# @user_managements.route("/view_child", methods=['GET', 'POST'])
# def view_child():
#     userId = request.args.get("userId","")
#     user_list = []
#     usersList = []
#     userName =""
#     try:
#         users_queryset = Users.objects(parentId=userId,status__nin=[2]).order_by("-id")
#         for each_user in users_queryset:
#             userDict = fetching_user_details(each_user)
#             usersList.append(userDict)

#         users = Users.objects(id__ne=userId,status=1).order_by("-id")
#         for each_user in users:
#             user = {
#             'id': str(each_user.id),
#             'fullName': each_user.fullName,
#             }
#             user_list.append(user)
#         user_queryset = Users.objects(id=userId,status__in=[1]).first()
#         if user_queryset:
#             userName = user_queryset.fullName
#         else:
#             userName = ""
#     except Exception as e:
#         app.logger.error(traceback.format_exc())

#     return render_template('super_admin_templates/view_child.html',
#         usersList=usersList,
#         user_list=user_list,
#         userId=userId,
#         userName=userName
#         )

@user_managements.route("/view_child", methods=['GET', 'POST'])
def view_child():
    userId = request.args.get("userId","")
    childsDropdownList = []
    usersList = []
    userName = ""
    try:
        user_queryset = Users.objects(id=userId,status=1).first()
        if user_queryset:
            userName = user_queryset.fullName
        else:
            userName = ""
        print(str(user_queryset.parentId.id),"parentId")
        print(str(user_queryset.id),"userid")
        # parent_id=""
        # if user_queryset.parentId:
        #     parentId= Q(id__ne=str(user_queryset.parentId.id))
        # childs_dropdown_queryset = Users.objects(Q(id__ne=str(user_queryset.id)) | parentId | Q(parentId__ne=str(user_queryset.id)))

        idsList = [str(user_queryset.id)]
        if user_queryset.parentId:
            idsList.append(str(user_queryset.parentId.id))

        # childs_dropdown_queryset = Users.objects(Q(id__nin=idsList) | Q(parentId__ne=str(user_queryset.id)))
        childs_dropdown_queryset = Users.objects(id__nin=idsList,parentId__ne=str(user_queryset.id),status=1)

        for each_child in childs_dropdown_queryset:
            childDict = {
            "childId":str(each_child.id),
            "childName":each_child.fullName
            }
            childsDropdownList.append(childDict)
        print(childsDropdownList,"(((((((((((((childsDropdownList)))))))))))))")


        users_queryset = Users.objects(parentId=userId,status=1)
        for each_user in users_queryset:
            userDict = fetching_user_details(each_user)
            usersList.append(userDict)
    except Exception as e:
        app.logger.error(traceback.format_exc())

    return render_template('super_admin_templates/view_child.html',
        childsDropdownList=childsDropdownList,
        usersList=usersList,
        userId=userId,
        userName=userName
        )

@user_managements.route("/assign_child",methods=["POST","GET"])
def assign_child():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()
        if request.method == "POST":
            action = request.form.get("action", "HI").strip()
            data = request.form.to_dict()
            # Step 1: Handle OTP Generation
            if action == "generate":
                mail_type = data.get("mailType", "").strip()
                print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                if not mail_type:
                    return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                return jsonify(generate_otp_helper(mail_type))

            # tep 2: Handle OTP Verification
            elif action == "verify":
                otp_check_id = request.form.get("otpCheckId","SAI")
                otp_code = request.form.get("otpCode","K")

                print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                print(otp_code,"((((((((OTP CODE????????????))))))))")

                if not otp_check_id or not otp_code:
                    return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                return jsonify(verify_otp_helper(otp_check_id, otp_code))

            elif action == "update":
                otp_check_id = request.form.get("otpCheckId", "")
                otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                admin_id = request.form.get("adminId", "")

                otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
               
                if not otpcheck_queryset:
                    return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                # Update OTP status to 2 after verification
                otpcheck_queryset.update(status=2)
                return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

            userId = request.form.get("userId","")
            print(userId)
            print("(((((((userId)))))))")
            childId = request.form.get("childId","")
            print(childId)
            print("(((((childId)))))")
            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]
            remark = request.form.get("remark","")

            if userId:
                child_queryset = Users.objects(id=childId).first()
                # if not child_queryset.profileId:
                #     flash("This child has not been assigned a profile, so please assign!!")
                #     return redirect(url_for("user_managements.manage_users_list"))

                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                if admin_queryset:
                    message=admin_queryset.userName+" "+child_queryset.fullName+" Child assigned successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"assign_child","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                    save_remarks_data=save_admin_remarks_data(childId,adminId,remark,"assignchild")
                try:
                    child_queryset.update(parentId = ObjectId(userId))

                    flash("Child assigned successfully!")
                    return redirect(url_for("user_managements.view_child",userId=userId))
                except Exception as e:
                    flash("Unable to assign child!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("user_managements.view_child",userId=userId))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("user_managements.view_child",userId=userId))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to assign child!!!"
        return render_template("super_admin_templates/view_child.html",error=error)


@user_managements.route("/remove_child",methods=["POST","GET"])
def remove_child():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            userAgent = request.headers.get("User-Agent")
            loginBrowseData = userAgent.split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        userId = request.args.get("userId","")
        # fuserId = request.form.get("fuserId","")
        print(userId)
        print("(((((((((((userId)))))))))))")
        actionDate=datetime.datetime.now()
        if request.method == "POST":
            action = request.form.get("action", "HI").strip()
            data = request.form.to_dict()
            # Step 1: Handle OTP Generation
            if action == "generate":
                mail_type = data.get("mailType", "").strip()
                print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                if not mail_type:
                    return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                return jsonify(generate_otp_helper(mail_type))

            # tep 2: Handle OTP Verification
            elif action == "verify":
                otp_check_id = request.form.get("otpCheckId","SAI")
                otp_code = request.form.get("otpCode","K")

                print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                print(otp_code,"((((((((OTP CODE????????????))))))))")

                if not otp_check_id or not otp_code:
                    return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                return jsonify(verify_otp_helper(otp_check_id, otp_code))

            elif action == "update":
                otp_check_id = request.form.get("otpCheckId", "")
                otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                admin_id = request.form.get("adminId", "")

                otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
               
                if not otpcheck_queryset:
                    return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                # Update OTP status to 2 after verification
                otpcheck_queryset.update(status=2)
                return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

            childId = request.args.get("childId","B")
            print(childId)
            print("(((((childId)))))")
            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]
            remark = request.form.get("remark","")

            if userId:
                child_queryset = Users.objects(id=childId,status=1).first()
                # if not child_queryset.profileId:
                #     flash("This child has not been assigned a profile, so please assign!!")
                #     return redirect(url_for("user_managements.manage_users_list"))

                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                if admin_queryset:
                    message=admin_queryset.userName+" "+child_queryset.fullName+" Child removed successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"remove_child","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                    save_remarks_data=save_admin_remarks_data(childId,adminId,remark,"removeChild")
                try:
                    child_queryset.update(parentId = None)

                    flash("Child removed successfully!")
                    return redirect(url_for("user_managements.view_child",userId=userId))
                except Exception as e:
                    flash("Unable to remove child!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("user_managements.view_child",userId=userId))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("user_managements.view_child",userId=userId))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to assign child!!!"
        return render_template("super_admin_templates/view_child.html",error=error)

# @user_managements.route("/add_child",methods=["POST","GET"])
# def add_child():
#     try:
#         if not session.get("adminId"):
#             return redirect("admin_login")
#         adminId = session.get("adminId")
        
#         loginBrowser = request.headers.get("Sec-Ch-Ua")
#         if loginBrowser:
#             loginBrowseData = loginBrowser.split(";")
#             browser = loginBrowseData[0]
#         else:
#             loginBrowseData = userAgent.split(";")
#             browser = loginBrowseData[0]

#         client_ip=0
#         # Extracting client IP address
#         if request.headers.getlist("X-Forwarded-For"): 
#             client_ip = request.headers.getlist("X-Forwarded-For")[0]
#         else:
#             client_ip = request.remote_addr

#         actionDate=datetime.datetime.now()
#         if request.method == "POST":
#             userId = request.form.get("userId","")
#             print(userId)
#             print("(((((((userId)))))))")
#             childId = request.form.get("childId","")
#             print(childId)
#             print("(((((childId)))))")
#             jsonData = request.form.to_dict(flat=True)
#             requestData = [jsonData]
#             updatedrequestData = [jsonData]
#             remark = request.form.get("remark","")

#             if userId:
#                 child_queryset = Users.objects(id=childId,status=1).first()
#                 if not child_queryset.profileId:
#                     flash("This child has not been assigned a profile, so please assign!!")
#                     return redirect(url_for("user_managements.manage_users_list"))

#                 admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
#                 if admin_queryset:
#                     message=admin_queryset.userName+" "+child_queryset.fullName+" Child assigned successfully!"
#                     save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_child","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
#                     save_remarks_data=save_admin_remarks_data(childId,adminId,remark,"assignchild")
#                 try:
#                     child_queryset.update(parentId = ObjectId(userId))

#                     flash("Child assigned successfully!")
#                     return redirect(url_for("user_managements.view_child",userId=userId))
#                 except Exception as e:
#                     flash("Unable to assign child!!")
#                     app.logger.error(traceback.format_exc())
#                     return redirect(url_for("user_managements.view_child",userId=userId))
#             else:
#                 flash("Required fields are missing!!")
#                 return redirect(url_for("user_managements.view_child",userId=userId))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to assign child!!!"
#         return render_template("super_admin_templates/view_child.html",error=error)




@user_managements.route("/add_commission_to_user",methods=["POST","GET"])
def add_commission_to_user():
    if not session.get("adminId"):
        return redirect("admin_login")
    userId = request.args.get("userId","")
    commissionId = request.form.get("commissionId","")

    if userId:
        try:
            user_queryset = Users.objects(id=userId,status__nin=[2]).first()
            if user_queryset:
                user_queryset.update(
                    commissionId = ObjectId(commissionId),
                    )
                flash("Commission added successfully!")
                return redirect(url_for("user_managements.manage_users_list"))
            else:
                flash("Invaild user id!!")
                return redirect(url_for("user_managements.manage_users_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("user_managements.manage_users_list"))
    else:
        return redirect(url_for("user_managements.manage_users_list"))



@user_managements.route("/block_user_status",methods=["POST","GET"])
def block_user_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        userAgent = request.headers.get("User-Agent")
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
    if "block" in permissionsList:
        userId = request.args.get("userId","")
        remark = request.form.get("remark")

        if userId:
            try:
                user_queryset = Users.objects(id=userId,status__nin=[2]).first()
                existing_record = user_queryset.to_json()
                requestData = [existing_record]
                if user_queryset:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if (user_queryset.status == 0) or (user_queryset.status == 1):
                        user_queryset.update(status=3)
                        flash("User blocked successfully!")
                        message=admin_queryset.userName+" "+user_queryset.fullName+" User blocked successfully!"
                    elif user_queryset.status == 3:
                        user_queryset.update(status=1)
                        flash("User unblocked successfully!")
                        message=admin_queryset.userName+" "+user_queryset.fullName+" User unblocked successfully!"
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"block_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("user_managements.manage_users_list"))
                else:
                    flash("Invaild user id!!")
                    return redirect(url_for("user_managements.manage_users_list"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("user_managements.manage_users_list"))
        else:
            return redirect(url_for("user_managements.manage_users_list"))
    else:
        flash("Staff member does not have given block user status permissions!!")
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/blocked_users_list",methods=["POST","GET"])
def blocked_users_list():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        permissionsList = check_permissions(session.get("adminId"),"blockedMerchantPermissions")
        if "view" in permissionsList:
            adminId = session.get("adminId")
            blockedUsersList = []
            userKycList = []

            merchantEmail = request.form.get('merchantEmail', '')
            merchantName = request.form.get('merchantName', '')
            merchantPhone = request.form.get('merchantPhone', '')
            merchantId = request.form.get('merchantId', '')

            users_queryset = Users.objects(status=3).order_by("-id").all()
          

            # Get the current page from the query parameters
            page = request.args.get(get_page_parameter(), type=int, default=1)
            per_page = 20  # Number of items per page

            # Query the database for the current page's data
            total_count = users_queryset.count()

            start = (page - 1) * per_page
            end = min(start + per_page, total_count)

            total_blocked_users_list = users_queryset[start:end]

            for each_user in total_blocked_users_list:
                userDict = fetching_user_details(each_user)
                blockedUsersList.append(userDict)

            users_kyc_queryset = UserKYC.objects(status__nin=[2]).order_by("-id").all()
            for each_user_kyc in users_kyc_queryset:
                userKycDict = fetching_user_kyc_details(each_user_kyc)
                userKycList.append(userKycDict)
                        
            if merchantName:
                userKycList = [user for user in userKycList if merchantName.lower() in user["fullName"].lower()]

            if merchantPhone:
                userKycList = [user for user in userKycList if merchantPhone in user["phoneNumber"]]

            if merchantEmail:
                userKycList = [user for user in userKycList if merchantEmail in user["email"]]
            if merchantId:
                userKycList = [user for user in userKycList if merchantId in user["merchantUniqueNumber"]]


            # Pagination object for rendering pagination controls in the template
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right")
            

            return render_template("super_admin_templates/blocked_users_list.html",
                pagination=pagination,
                blockedUsersList=blockedUsersList,
                userKycList=userKycList,
                merchantName=merchantName,
                merchantEmail=merchantEmail,
                merchantPhone=merchantPhone,
                merchantId=merchantId,
                )
        else:
            flash("Staff member does not have given view block merchants permissions!!")
            return render_template("super_admin_templates/blocked_users_list.html")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetched blocked user data!!"
        return render_template("super_admin_templates/blocked_users_list.html", 
            error=error,
            pagination=pagination,
            blockedUsersList=blockedUsersList,
            userKycList=userKycList
            )


@user_managements.route("/unlock_user_status",methods=["POST","GET"])
def unlock_user_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        userAgent = request.headers.get("User-Agent")
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
    if "block" in permissionsList:
        userId = request.args.get("userId","")
        remark = request.form.get("remark")

        if userId:
            try:
                user_queryset = Users.objects(id=userId,status__nin=[2]).first()
                existing_record = user_queryset.to_json()
                requestData = [existing_record]
                if user_queryset:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if user_queryset.status == 5:
                        user_queryset.update(status=1)
                        flash("User unlocked successfully!")
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"unlock_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("user_managements.manage_users_list"))
                else:
                    flash("Invaild user id!!")
                    return redirect(url_for("user_managements.manage_users_list"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("user_managements.manage_users_list"))
        else:
            return redirect(url_for("user_managements.manage_users_list"))
    else:
        flash("Staff member does not have given unlock user status permissions!!")
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/locked_users_list", methods=["POST", "GET"])
def locked_users_list():
    pagination = None  # Initialize pagination at the start
    lockedUsersList = []  # Initialize lockedUsersList at the start
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        
        permissionsList = check_permissions(session.get("adminId"), "blockedMerchantPermissions")
        if "view" in permissionsList:
            adminId = session.get("adminId")
            merchantName = request.form.get('merchantName', '')
            merchantPhone = request.form.get('merchantPhone', '')
            merchantEmail = request.form.get('merchantEmail', '')
            merchantId = request.form.get('merchantId', '')

            users_queryset = Users.objects(status=5).order_by("-id").all()

            if merchantName:
                users_queryset = users_queryset.filter(fullName__icontains=merchantName)

            if merchantPhone:
                users_queryset = users_queryset.filter(phoneNumber__icontains=merchantPhone)

            if merchantEmail:
                users_queryset = users_queryset.filter(email__icontains=merchantEmail)

            if merchantId:
                users_queryset = users_queryset.filter(merchantUniqueNumber__icontains=merchantId)
            
            # Get the current page from the query parameters
            page = request.args.get(get_page_parameter(), type=int, default=1)
            per_page = 20  # Number of items per page

            # Query the database for the current page's data
            total_count = users_queryset.count()

            start = (page - 1) * per_page
            end = min(start + per_page, total_count)

            total_locked_users_list = users_queryset[start:end]

            for each_user in total_locked_users_list:
                userDict = fetching_user_details(each_user)
                lockedUsersList.append(userDict)

            # Pagination object for rendering pagination controls in the template
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right")
            
            return render_template("super_admin_templates/locked_users_list.html",
                pagination=pagination,
                merchantName=merchantName,
                merchantEmail=merchantEmail,
                merchantPhone=merchantPhone,
                merchantId=merchantId,
                lockedUsersList=lockedUsersList
            )
        else:
            flash("Staff member does not have given view lock merchants permissions!!")
            return render_template("super_admin_templates/locked_users_list.html")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch locked user data!!"
        return render_template("super_admin_templates/locked_users_list.html", 
            error=error,
            pagination=pagination,  # This will now be initialized
            lockedUsersList=lockedUsersList
        )


@user_managements.route("/lock_user_status",methods=["POST","GET"])
def lock_user_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        userAgent = request.headers.get("User-Agent")
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"userManagementPermissions")
    if "block" in permissionsList:
        userId = request.args.get("userId","")
        remark = request.form.get("remark")

        if userId:
            try:
                user_queryset = Users.objects(id=userId,status=5).first()
                existing_record = user_queryset.to_json()
                requestData = [existing_record]
                if user_queryset:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if user_queryset.status == 5:
                        user_queryset.update(status=1)
                        flash("User unlocked successfully!")
                        message=admin_queryset.userName+" "+user_queryset.fullName+" User unlocked successfully!"
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"lock_user_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("user_managements.manage_users_list"))
                else:
                    flash("Invaild user id!!")
                    return redirect(url_for("user_managements.manage_users_list"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("user_managements.manage_users_list"))
        else:
            return redirect(url_for("user_managements.manage_users_list"))
    else:
        flash("Staff member does not have given unlock user status permissions!!")
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/sub_categories_list",methods=["POST"])
def sub_categories_list():
    data_status = {"responseStatus":0,"result":""}
    subCategoriesList = []
    try:
        categoryId = request.form.get("categoryId","")
        if not categoryId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        sub_cat_queryset = MerchantSubCategories.objects(categoryId=categoryId,status__in=[1]).order_by("-id")
        for each_sub_merchant_category in sub_cat_queryset:
            sub_merchant_category_dict = fetching_sub_merchant_category_details(each_sub_merchant_category)
            subCategoriesList.append(sub_merchant_category_dict)

        data_status["responseStatus"]=1
        data_status["result"]="Sub categories data fetched successfully!"
        data_status["subCategoriesList"]=subCategoriesList
        return data_status   
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch sub categories data!!"
        return data_status

@user_managements.route("/assign_payment_gateways",methods=["POST","GET"])
def assign_payment_gateways():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        userId = request.args.get("userId","")
        userDict = {}
        payoutApisList = []
        payinApisList = []
        if request.method == "GET":

            user_queryset = Users.objects(id=userId, status__in=[0,1]).first()

            if not user_queryset:
                flash("Invalid user id!!")
                return redirect(url_for("user_managements.manage_users_list"))

            userDict = fetching_user_details(user_queryset)

            payout_apis_queryset = TransactionAPI.objects(transactionType="Payout",status=1).order_by('-id')
            for each_payout_api in payout_apis_queryset:
                apiDict = fetching_transaction_api_details(each_payout_api)
                payoutApisList.append(apiDict)

            payin_apis_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status=1).order_by('-id')
            for each_payin_api in payin_apis_queryset:
                apiDict = fetching_transaction_api_details(each_payin_api)
                payinApisList.append(apiDict)
            
            return render_template("super_admin_templates/assign_user_payment_gateway_details.html",
                userDict=userDict,
                payinApisList=payinApisList,
                payoutApisList=payoutApisList
                )

        if request.method == "POST":
            enablePayin = request.form.get("enablePayin",False)
            enablePayout = request.form.get("enablePayout",False)
            payInPaymentGatewayId = request.form.get("payInPaymentGatewayId","")
            payOutPaymentGatewayId = request.form.get("payOutPaymentGatewayId","")

            try:
                user_queryset = Users.objects(id=userId, status__in=[0,1]).first()
                if not user_queryset:
                    flash("Invalid user id!!")
                    return redirect(url_for("user_managements.manage_users_list"))
                if enablePayin == "True":
                    user_queryset.update(enablePayin=True)
                else:
                    user_queryset.update(enablePayin=False)
                if enablePayout == "True":
                    user_queryset.update(enablePayout=True)
                else:
                    user_queryset.update(enablePayout=False)

                if payInPaymentGatewayId:
                    user_queryset.update(payInPaymentGatewayId = ObjectId(payInPaymentGatewayId))
                    payin_balance_queryset = PayinBalances.objects(userId=str(user_queryset.id),transactionAPIId=payInPaymentGatewayId).first()
                    if not payin_balance_queryset:
                        payin_balance_table = PayinBalances(
                            userId=str(user_queryset.id),
                            transactionAPIId=payInPaymentGatewayId,
                            previousBalance=0,
                            currentBalance=0,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                else:
                    user_queryset.update(payInPaymentGatewayId = None)

                if payOutPaymentGatewayId:
                    user_queryset.update(payOutPaymentGatewayId = ObjectId(payOutPaymentGatewayId))
                    payout_balance_queryset = PayoutBalances.objects(userId=str(user_queryset.id),transactionAPIId=payOutPaymentGatewayId).first()
                    if not payout_balance_queryset:
                        payout_balance_table = PayoutBalances(
                            userId=str(user_queryset.id),
                            transactionAPIId=payOutPaymentGatewayId,
                            previousBalance=0,
                            currentBalance=0,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                else:
                    user_queryset.update(payOutPaymentGatewayId = None)

                flash("User assigned payment gateway successfully!")
                return redirect(url_for("user_managements.manage_users_list"))
            except Exception as e:
                flash("Unable to assign user payment gateway details!!")
                app.logger.error(traceback.format_exc())
                return redirect(url_for("user_managements.manage_users_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to assign user payment gateway details!!"
        return render_template("super_admin_templates/user_managements_list.html",error=error)


@user_managements.route("/testing_for_unique",methods=["GET"])
def testing_for_unique():
    try:
        next_serial_number = generate_next_serial_number()
        print(next_serial_number,"****************")
        return next_serial_number
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False


@user_managements.route("/testing_for_payin",methods=["GET"])
def testing_for_payin():
    try:
        if request.method == "GET":
            return render_template("super_admin_templates/testing_payin.html")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

@user_managements.route("/checking_for_phone_number",methods=["POST"])
def checking_for_phone_number():
    data_status={"responseStatus":0,"result":""}
    phoneNumber = request.form.get("phoneNumber")
    try:
        user_queryset = Users.objects(phoneNumber=phoneNumber).first()
        if user_queryset:
            data_status["responseStatus"]=1
            data_status["result"]="This phone number is already in use!!"
            return data_status
        else:
            data_status["responseStatus"]=0
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["responseStatus"]=0
        return data_status

@user_managements.route("/checking_for_pan_number",methods=["POST"])
def checking_for_pan_number():
    data_status={"responseStatus":0,"result":""}
    panNumber = request.form.get("panNumber")
    try:
        user_kyc_queryset = UserKYC.objects(panNumber=panNumber).first()
        if user_kyc_queryset:
            data_status["responseStatus"]=1
            data_status["result"]="This pan number is already in use!!"
            return data_status
        else:
            data_status["responseStatus"]=0
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["responseStatus"]=0
        return data_status


@user_managements.route("/password_update",methods=["POST"])
def password_update():
    userId =request.json.get("userId")
    password =request.json.get("password")
    try:
        user_queryset = Users.objects(id=userId).first()
        if user_queryset:
            user_queryset.update(password=generate_password_hash(password))

            return "Success"
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False

@user_managements.route("/admin_password_update",methods=["POST"])
def admin_password_update():
    adminId =request.json.get("adminId")
    password =request.json.get("password")
    try:
        admin_queryset = SuperAdmin.objects(id=adminId).first()
        if admin_queryset:
            admin_queryset.update(password=generate_password_hash(password))

            return "Success"
    except Exception as e:
        app.logger.error(traceback.format_exc())
        return False


@user_managements.route("/merchant_change_password", methods=["POST", "GET"])
def merchant_change_password():
    if not session.get("adminId"):
        return redirect(url_for("admin_login"))
    adminId = session.get("adminId")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        userAgent = request.headers.get("User-Agent")
        loginBrowseData = userAgent.split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]

    userId = request.args.get("userId", "")
    newPassword = request.form.get("newPassword", "")
    confirmNewPassword = request.form.get("confirmNewPassword", "")
    remark = request.form.get("remark")

    userDict = {}

    action = request.form.get("action", "HI").strip()
    data = request.form.to_dict()
    # Step 1: Handle OTP Generation
    if action == "generate":
        mail_type = data.get("mailType", "").strip()
        print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
        if not mail_type:
            return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


        return jsonify(generate_otp_helper(mail_type))

    # tep 2: Handle OTP Verification
    elif action == "verify":
        otp_check_id = request.form.get("otpCheckId","SAI")
        otp_code = request.form.get("otpCode","K")

        print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
        print(otp_code,"((((((((OTP CODE????????????))))))))")

        if not otp_check_id or not otp_code:
            return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

        return jsonify(verify_otp_helper(otp_check_id, otp_code))

    # Step 3: Ensure OTP is Verified Before Updating Service Charges
    elif action == "update":
        otp_check_id = request.form.get("otpCheckId", "")
        otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
        admin_id = request.form.get("adminId", "")

        otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
       
        if not otpcheck_queryset:
            return jsonify({"responseStatus": 0, "result": "Invalid Request."})
        # Update OTP status to 2 after verification
        otpcheck_queryset.update(status=2)
        return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})
        
    try:
        if request.method == "GET":
            merchant_queryset = Users.objects(id=userId, status__in=[0, 1]).first()
            if not merchant_queryset:
                flash("Invalid merchant id!")
                return redirect(url_for("user_managements.manage_users_list"))

            userDict = fetching_user_details(merchant_queryset)
            return render_template("super_admin_templates/merchant_change_password.html", userDict=userDict)

        if request.method == "POST":
            if not userId or not newPassword or not confirmNewPassword:
                flash("Required fields are missing!")
                return redirect(url_for("user_managements.merchant_change_password",userId=userId))
            if newPassword == confirmNewPassword:
                merchant_queryset = Users.objects(id=userId, status__in=[0, 1]).first()
                existing_record = merchant_queryset.to_json()
                requestData = [existing_record]
                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                if merchant_queryset:
                    merchant_queryset.update(password=generate_password_hash(newPassword))
                    flash("Successfully changed the password!")
                    message=admin_queryset.userName+" "+merchant_queryset.fullName+" Successfully changed the password!"
                    save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"merchant")
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"merchant_change_password","updatepassword",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("user_managements.manage_users_list"))
                else:
                    flash("Invalid Merchant Id!")
                    return redirect(url_for("user_managements.merchant_change_password",userId=userId))
            else:
                flash("New password and confirm new password do not match!")
                return redirect(url_for("user_managements.merchant_change_password",userId=userId))

    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Server Connection Error.Please try again!")
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/merchant_capbalance", methods=["POST", "GET"])
def merchant_capbalance():
    if not session.get("adminId"):
        return redirect(url_for("admin_login"))
    adminId = session.get("adminId")

    userId = request.args.get("userId", "")
    capBalance = request.form.get("capBalance", "")
    remark = request.form.get("remark","")
    userDict = {}
    try:
        save_remarks_data=save_admin_remarks_data(userId,adminId,remark,"capBalance")
        if request.method == "POST":
            action = request.form.get("action", "HI").strip()
            data = request.form.to_dict()
            # Step 1: Handle OTP Generation
            if action == "generate":
                mail_type = data.get("mailType", "").strip()
                print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                if not mail_type:
                    return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                return jsonify(generate_otp_helper(mail_type))

            # tep 2: Handle OTP Verification
            elif action == "verify":
                otp_check_id = request.form.get("otpCheckId","SAI")
                otp_code = request.form.get("otpCode","K")

                print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                print(otp_code,"((((((((OTP CODE????????????))))))))")

                if not otp_check_id or not otp_code:
                    return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                return jsonify(verify_otp_helper(otp_check_id, otp_code))

            elif action == "update":
                otp_check_id = request.form.get("otpCheckId", "")
                otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                admin_id = request.form.get("adminId", "")

                otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
               
                if not otpcheck_queryset:
                    return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                # Update OTP status to 2 after verification
                otpcheck_queryset.update(status=2)
                return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

            previousBalance = request.form.get("previousBalance","")
            currentBalance = request.form.get("currentBalance","")
            if userId:
                capbalance_queryset = Users.objects(id=userId, status__in=[0, 1]).first()
                if capbalance_queryset:
                    capbalance_queryset.update(capBalance = capBalance)
                    
                    capbalance_table = CapBalanceLogs(
                        adminId=adminId,
                        userId = userId,
                        previousBalance = capbalance_queryset.capBalance,
                        currentBalance = capBalance,
                        createdOn = datetime.datetime.now(),
                        status = 1
                        )
                    save_table = capbalance_table.save()
                    flash("CapBalance updated successfully!")
                    return redirect(url_for("user_managements.manage_users_list"))
                else:
                    flash("Invalid merchant id!")
                    return redirect(url_for("user_managements.manage_users_list"))
            else:
                flash("Required fields are missing!")
                return redirect(url_for("user_managements.merchant_capbalance",userId=userId))
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Server Connection Error.Please try again!")
        return redirect(url_for("user_managements.manage_users_list"))


# @user_managements.route("/documents_update_status", methods=["POST"])
# def documents_update_status():
#     if not session.get("adminId"):
#         return redirect(url_for("admin_login"))
    
#     adminId = session.get("adminId")
#     userId = request.args.get("userId", "")
#     documentStatus = request.form.get("documentStatus", "")
#     documentId = request.form.get("documentId", "")
    
#     try:
#         if request.method == "POST":
#             if userId and documentId and documentStatus:
#                 print(userId,"userId")
#                 print(documentId,"documentId")
#                 print(documentStatus,"documentStatus")

#                 user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
#                 if not user_kyc_queryset:
#                     flash("Invalid User Id!!")
#                     return redirect(url_for("user_managements.user_update", userId=userId))

#                 existingDocumentsList = user_kyc_queryset.documentsList or []
#                 for each_document in user_kyc_queryset.documentsList:
#                     if each_document.get("documentId") == documentId:
#                         documentDict = {
#                         "documentId":documentId,
#                         "documentName":each_document.get("documentName"),
#                         "image":each_document.get("image"),
#                         "documentStatus":documentStatus
#                         }
#                         existingDocumentsList.append(documentDict)
#                 user_kyc_queryset.update(documentsList=existingDocumentsList)
#                 flash("Document status updated successfully!")
#                 return redirect(url_for("user_managements.user_update", userId=userId))
#             else:
#                 flash("Required fields are missing!")
#                 return redirect(url_for("user_managements.user_update", userId=userId))
    
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Server Connection Error. Please try again!")
#         return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/documents_update_status", methods=["POST"])
def documents_update_status():
    if not session.get("adminId"):
        return redirect(url_for("admin_login"))
    
    print("HII 123")
    userKycpage = request.form.get("userKycpage","")
    adminId = session.get("adminId")
    if userKycpage!="":
        userId = request.args.get("userKycId", "")
    else:
        userId = request.args.get("userId", "")
    documentStatus = request.form.get("documentStatus", "")
    documentId = request.form.getlist("documentId")
    
    print(documentId,"(((((((((((((((documentId)))))))))))))))")
    print(userId,"(((((((((((((((documents_update_status)))))))))))))))")
    try:
        if request.method == "POST":
            if userId and documentId and documentStatus:

                if userKycpage!="":
                    user_kyc_queryset = UserKYC.objects(id=userId, status__in=[0,1]).first()
                    if not user_kyc_queryset:
                        flash("Invalid User Id!!")
                        return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,redirectTo="businessDetails"))
                else:
                    user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
                    if not user_kyc_queryset:
                        flash("Invalid User Id!!")
                        return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))

                

                updated = False
                # Iterate over documents and update the status of the matching document
                for each_document in user_kyc_queryset.documentsList:
                    print(each_document.get("documentId"),"@@@@@@@@@@@@@@@@@@@@@")
                    print(documentId,"documentId")
                    if str(each_document.get("documentId")) in documentId:
                        each_document["documentStatus"] = documentStatus  # Update the status
                        updated = True
                        

                print(updated,"((((((updated))))))")
                if updated:
                    user_kyc_queryset.save()  # Save the changes to the database
                    flash("Document status updated successfully!")
                else:
                    flash("Document not found!")
                if userKycpage!="":
                    return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,documentStatus=documentStatus,redirectTo="businessDetails"))
                else:
                    return redirect(url_for("user_managements.user_update", userId=userId,documentStatus=documentStatus,redirectTo="businessDetails"))
            else:
                flash("Required fields are missing!")
                if userKycpage!="":
                    return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,redirectTo="businessDetails"))
                else:
                    return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))
    
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Server Connection Error. Please try again!")
        return redirect(url_for("user_managements.manage_users_list"))

@user_managements.route("/shop_images_update_status", methods=["POST"])
def shop_images_update_status():
    if not session.get("adminId"):
        return redirect(url_for("admin_login"))
    userKycpage = request.form.get("userKycpage","")
    print(userKycpage,"userKycpage hittttttttttttt")
    adminId = session.get("adminId")
    if userKycpage!="":
        userId = request.args.get("userKycId", "")
    else:
        userId = request.args.get("userId", "")

    shopImageStatus = request.form.get("shopImageStatus", "")
    shopImageNumber = request.form.getlist("shopImageNumber")
    shopRemark = request.form.get("shopRemark")
    

    print(shopImageNumber,"(((((((((((((((shopImageNumber list)))))))))))))))")
    
    try:
        if request.method == "POST":
            if userId and shopImageNumber and shopImageStatus:
                if userKycpage!="":
                    user_kyc_queryset = UserKYC.objects(id=userId, status__in=[0,1]).first()
                    if not user_kyc_queryset:
                        flash("Invalid User Id!!")
                        return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,redirectTo="businessDetails"))
                else:
                    user_kyc_queryset = UserKYC.objects(userId=userId, status__in=[0,1]).first()
                    if not user_kyc_queryset:
                        flash("Invalid User Id!!")
                        return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))

                updated = False

                user_kyc_queryset.update(shopRemark=shopRemark)
                
                # Iterate over documents and update the status of the matching document
                for each_shop_image in user_kyc_queryset.shopImagesList:
                    if str(each_shop_image.get("shopImageNumber")) in shopImageNumber:
                        each_shop_image["shopImageStatus"] = shopImageStatus  # Update the status
                        updated = True
                        print(updated,"((((((updated))))))")

                print(updated,"((((((updated))))))")
                if updated:
                    user_kyc_queryset.save()  # Save the changes to the database
                    flash("Shop image status updated successfully!")
                else:
                    flash("Shop image not found!")
                if userKycpage!="":
                    return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,redirectTo="businessDetails"))
                else:
                    return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))
            else:
                flash("Required fields are missing!")
                if userKycpage!="":
                    return redirect(url_for("user_managements.user_kyc_update", userKycId=userId,redirectTo="businessDetails"))
                else:
                    return redirect(url_for("user_managements.user_update", userId=userId,redirectTo="businessDetails"))
    
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Server Connection Error. Please try again!")
        return redirect(url_for("user_managements.manage_users_list"))


@user_managements.route('/get_merchant_counts', methods=['GET'])
def get_merchant_counts():
   
    rejected_count = 0
    pending_count = 0
    submitted_count = 0
    approved_count = 0
    
    blocked_merchants_count = Users.objects(status=3).count()
    locked_merchants_count = Users.objects(status=5).count()

    users_queryset = Users.objects(status__ne=2)

    kycUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId != None) and (each_user.entityTypeId.isIndividual == False)]
    trueUsersList = [str(each_user.id) for each_user in users_queryset if (each_user.entityTypeId == None) or (each_user.entityTypeId.isIndividual == True)]

    # Base query for UserKYC
    user_kycs_queryset = UserKYC.objects(status__nin=[2]).order_by("-submittedDate")

        
    user_kycs_queryset = user_kycs_queryset.filter(
        (Q(userId__in=kycUsersList) & (Q(documentsList=[]) | Q(shopImagesList=[]) | Q(documentsList=None) | Q(shopImagesList=None) | Q(shopImagesList__elemMatch={"shopImageStatus": {"$ne": "Approved"}}) | Q(documentsList__elemMatch={"documentStatus": {"$ne": "Approved"}}) | Q(businessStatus__ne="Approved")  | Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved") | Q(shopVideoStatus__ne="Approved"))) |
        (Q(userId__in=trueUsersList) & (Q(panStatus__ne="Approved") | Q(bankStatus__ne="Approved") | Q(aadharStatus__ne="Approved") | Q(agreementVerificationStatus__ne="Approved") | Q(videoVerificationStatus__ne="Approved")))
    )
    pending_count=user_kycs_queryset.count()

    # Prepare the response data
    response_data = {
        "pending_count": pending_count,
        "blocked_merchants_count": blocked_merchants_count,
        "locked_merchants_count": locked_merchants_count,
    }

    return jsonify(response_data)