from appservices.common.util import *

payment_master = Blueprint("payment_master",__name__)

# Add Payment Mode
@payment_master.route("/add_payment_mode",methods=["POST","GET"])
def add_payment_mode():
    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 = request.headers.get('User-Agent').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,"paymentMasterPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                paymentMode = request.form.get("paymentMode","")
                walletType = request.form.get("walletType","")  #"Payout" or "Payin"
                hasGroup = request.form.get("hasGroup","") # "Yes" or "No"
                groupType = request.form.get("groupType","") # Banks
                image = request.files.get("image","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if paymentMode and walletType:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+paymentMode+" Payment mode saved successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_payment_mode","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                        payment_mode_table = PaymentMode(
                            adminId = adminId,
                            paymentMode = paymentMode,
                            walletType = walletType,
                            hasGroup = hasGroup,
                            groupType = groupType,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = payment_mode_table.save()
                        paymentModeId = str(save_table.id)

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


                        flash("Payment mode saved successfully!")
                        return redirect(url_for("payment_master.payment_masters_list"))
                    except Exception as e:
                        flash("Unable to save wallet!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("payment_master.payment_masters_list"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("payment_master.payment_masters_list"))
        else:
            flash("Staff member does not have given create payment mode permissions!!")
            return redirect(url_for("payment_master.payment_masters_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save payment mode!!"
        return render_template("super_admin_templates/payment_masters_list.html",error=error)

@payment_master.route("/payment_masters_list",methods=["POST","GET"])
def payment_masters_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    paymentsModeList = []
    subPaymentsModeList = []
    configPaymentGatewaysList = []
    transactionAPIsList = []
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"paymentMasterPermissions")
    if "view" in permissionsList:
        try:
            redirectto = request.args.get('redirectto','PaymentMode')
            if redirectto:
                redirectval=redirectto
            else:
                redirectval="PaymentMode"

            payment_mode_search_element = request.form.get("payment_mode_search_element","")
            sub_paymentmode_search_element = request.form.get("sub_paymentmode_search_element","")

            payments_mod_queryset = PaymentMode.objects(status__in=[0,1]).order_by("-id")
            if payment_mode_search_element:
                payments_mod_queryset = payments_mod_queryset.filter(Q(paymentMode__icontains=payment_mode_search_element))

            for each_payment_mode in payments_mod_queryset:
                payment_mode_data = fetching_payment_mode_details(each_payment_mode)
                paymentsModeList.append(payment_mode_data)
            

            ################# For Sub Payment Modes Data ##################
            sub_payments_mod_queryset = SubPaymentModes.objects(status__in=[0,1]).order_by("-id")
            if sub_paymentmode_search_element:
                sub_payments_mod_queryset = sub_payments_mod_queryset.filter(Q(subPaymentModeType__icontains=sub_paymentmode_search_element))

            for each_sub_payment_mode in sub_payments_mod_queryset:
                sub_payment_mode_data = fetching_sub_payment_mode_details(each_sub_payment_mode)
                subPaymentsModeList.append(sub_payment_mode_data)


            ################# For Config Payment Gatesways Data ##################
            config_payment_gateway_queryset = ConfigPaymentGateways.objects(status__in=[0,1]).order_by("-id")

            for each_config_payment_gateway in config_payment_gateway_queryset:
                config_payment_gateway_dict = fetching_config_payment_gateway_details(each_config_payment_gateway)
                configPaymentGatewaysList.append(config_payment_gateway_dict)

                    
            transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id').all()
            for each_transaction_api in transaction_API_queryset:
                service_grouping_dict = {
                "id":str(each_transaction_api.id),
                "apiName":each_transaction_api.apiName
                }
                transactionAPIsList.append(service_grouping_dict)

            return render_template("super_admin_templates/payment_masters_list.html",
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                configPaymentGatewaysList=configPaymentGatewaysList,
                transactionAPIsList=transactionAPIsList,
                payment_mode_search_element=payment_mode_search_element,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch payment modes details!!"
            return render_template("super_admin_templates/payment_masters_list.html", 
                error=error,
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                configPaymentGatewaysList=configPaymentGatewaysList,
                transactionAPIsList=transactionAPIsList,
                payment_mode_search_element=payment_mode_search_element,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval
                )
    else:
        flash("Staff member does not have given view payment mode permissions!!")
        return render_template("super_admin_templates/payment_masters_list.html")


# Update payment mode
@payment_master.route("/update_payment_mode",methods=["POST","GET"])
def update_payment_mode():
    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 = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    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()

    try:
        permissionsList = check_permissions(session.get("adminId"),"paymentMasterPermissions")
        if "edit" in permissionsList:
            paymentModeId = request.args.get("paymentModeId","")
            if request.method == "POST":
                paymentMode = request.form.get("paymentMode","")
                walletType = request.form.get("walletType","")
                hasGroup = request.form.get("hasGroup","") # "Yes" or "No"
                groupType = request.form.get("groupType","") # Banks
                image = request.files.get("image","")

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

                if paymentModeId and paymentMode and walletType:
                    payment_mode_queryset = PaymentMode.objects(id=paymentModeId,status__in=[0,1]).first()
                    existing_record = payment_mode_queryset.to_json()
                    message=payment_mode_queryset.adminId.userName+" "+paymentMode+" Payment mode updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_payment_mode","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                    if payment_mode_queryset:
                        payment_mode_queryset.update(
                            paymentMode=paymentMode,
                            walletType=walletType,
                            hasGroup = hasGroup,
                            groupType = groupType,
                            )
                        if image:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/paymentMode/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/paymentMode/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/paymentMode/"+paymentModeId+".png"))
                            payment_mode_queryset.update(image="media/paymentMode/"+paymentModeId+".png")

                        flash("Payment mode updated successfully!")
                        return redirect(url_for("payment_master.payment_masters_list"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("payment_master.payment_masters_list"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("payment_master.payment_masters_list"))
        else:
            flash("Staff member does not have given update payment mode permissions!!")
            return redirect(url_for("payment_master.payment_masters_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update payment mode details!!"
        return redirect(url_for("payment_master.payment_masters_list",error=error))

# Update payment mode status
@payment_master.route("/update_payment_status",methods=["POST","GET"])
def update_payment_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:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    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)
    
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"paymentMasterPermissions")
    if "edit" in permissionsList:
        paymentModeId = request.args.get("paymentModeId","")

        if paymentModeId:
            try:
                payment_mode_queryset = PaymentMode.objects(id=paymentModeId,status__in=[0,1]).first()
                existing_record = payment_mode_queryset.to_json()
                requestData = [existing_record]
                if payment_mode_queryset:
                    if payment_mode_queryset.status == 0:
                        payment_mode_queryset.update(status=1)
                        flash("Payment mode activated successfully!")
                        message=payment_mode_queryset.adminId.userName+" "+payment_mode_queryset.paymentMode+" Payment mode activated successfully!"
                    elif payment_mode_queryset.status == 1:
                        payment_mode_queryset.update(status=0)
                        flash("Payment mode deactivated successfully!")
                        message=payment_mode_queryset.adminId.userName+" "+payment_mode_queryset.paymentMode+" payment mode deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_payment_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                    return redirect(url_for("payment_master.payment_masters_list"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("payment_master.payment_masters_list"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("payment_master.payment_masters_list"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("payment_master.payment_masters_list"))
    else:
        flash("Staff member does not have given update status payment mode permissions!!")
        return redirect(url_for("payment_master.payment_masters_list"))

# Delete payment mode account
@payment_master.route("/delete_payment_mode",methods=["POST","GET"])
def delete_company_bank():
    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 = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    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)
    
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"paymentMasterPermissions")
    if "delete" in permissionsList:
        paymentModeId = request.args.get("paymentModeId","")

        if paymentModeId:
            try:
                payment_mode_queryset = PaymentMode.objects(id=paymentModeId,status__in=[0,1]).first()
                existing_record = payment_mode_queryset.to_json()
                requestData = [existing_record]
                if payment_mode_queryset:
                    payment_mode_queryset.update(status=2)
                    flash("Payment mode deleted successfully!")
                    message=payment_mode_queryset.adminId.userName+" "+payment_mode_queryset.paymentMode+" Payment mode deleted successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_payment_mode","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("payment_master.payment_masters_list"))
                else:
                    flash("Invaild id!!")
                    message=payment_mode_queryset.adminId.userName+" "+payment_mode_queryset.paymentMode+" Invaild details !!"
                    return redirect(url_for("payment_master.payment_masters_list"))
                
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("payment_master.payment_masters_list"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("payment_master.payment_masters_list"))
    else:
        flash("Staff member does not have given delete payment mode permissions!!")
        return redirect(url_for("payment_master.payment_masters_list"))


@payment_master.route("/sub_payment_modes_list",methods=["POST","GET"])
def sub_payment_modes_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    paymentsModeList = []
    subPaymentsModeList = []
    configPaymentGatewaysList = []
    transactionAPIsList = []
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"subpaymentmodePermissions")
    if "view" in permissionsList:
        try:
            redirectto = request.args.get('redirectto','SubPaymentMode')
            if redirectto:
                redirectval=redirectto
            else:
                redirectval="SubPaymentMode"

            sub_paymentmode_search_element = request.form.get("sub_paymentmode_search_element","")

            payments_mods_queryset = PaymentMode.objects(status__in=[0,1]).order_by("-id")
            for each_payment_mode in payments_mods_queryset:
                payment_mode_data = fetching_payment_mode_details(each_payment_mode)
                paymentsModeList.append(payment_mode_data)
        

            ################# For Sub Payment Modes Data ##################
            sub_payments_mod_queryset = SubPaymentModes.objects(status__in=[0,1]).order_by("-id")
            if sub_paymentmode_search_element:
                sub_payments_mod_queryset = sub_payments_mod_queryset.filter(Q(subPaymentModeType__icontains=sub_paymentmode_search_element))
                            
            for each_sub_payment_mode in sub_payments_mod_queryset:
                sub_payment_mode_data = fetching_sub_payment_mode_details(each_sub_payment_mode)
                subPaymentsModeList.append(sub_payment_mode_data)
                            
            transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id').all()
            for each_transaction_api in transaction_API_queryset:
                service_grouping_dict = {
                "id":str(each_transaction_api.id),
                "apiName":each_transaction_api.apiName
                }
                transactionAPIsList.append(service_grouping_dict)

            return render_template("super_admin_templates/sub_payment_modes_list.html",
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                transactionAPIsList=transactionAPIsList,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch sub payment modes details!!"
            return render_template("super_admin_templates/sub_payment_modes_list.html", 
                error=error,
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                transactionAPIsList=transactionAPIsList,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval
                )
    else:
        flash("Staff member does not have given view sub payment mode permissions!!")
        return render_template("super_admin_templates/sub_payment_modes_list.html")


# Add Sub Payment Mode
@payment_master.route("/add_sub_payment_mode",methods=["POST","GET"])
def add_sub_payment_mode():
    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 = request.headers.get('User-Agent').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,"subpaymentmodePermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                paymentModeId = request.form.get("paymentModeId","")
                subPaymentModeType = request.form.get("subPaymentModeType","")
                image = request.files.get("image","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if paymentModeId and subPaymentModeType:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+subPaymentModeType+" Sub payment mode saved successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sub_payment_mode","create",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                        sub_payment_mode_table = SubPaymentModes(
                            adminId = adminId,
                            paymentModeId = paymentModeId,
                            subPaymentModeType = subPaymentModeType,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = sub_payment_mode_table.save()
                        subPaymentModeId = str(save_table.id)

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

                        flash("Sub payment mode saved successfully!")
                        return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
                    except Exception as e:
                        flash("Unable to save sub paymentmode!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
        else:
            flash("Staff member does not have given create sub payment mode permissions!!")
            return redirect(url_for("payment_master.sub_payment_modes_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save sub payment mode!!"
        return render_template("super_admin_templates/sub_payment_modes_list.html",error=error)



# # View All Payment masters List
# @payment_master.route("/sub_payment_masters_list",methods=["POST","GET"])
# def sub_payment_masters_list():
#     if not session.get("adminId"):
#         return redirect("admin_login")
    
#     adminId = session.get("adminId")

#     subPaymentsModeList = []
#     try:
#         redirectto = request.args.get("redirectto","SubPaymentMode")
#         if redirectto:
#             redirectval = redirectto
#         else:
#             redirectval = "SubPaymentMode"

#         sub_paymentmode_search_element = request.form.get("sub_paymentmode_search_element","")

#         page = request.args.get(get_page_parameter(), type=int, default=1)
#         page_start,page_end=fetch_limit_length_based_on_page_index(page,10)
#         pagination = Pagination(
#             page=page,
#             record_name='payment_master',
#             per_page=10,
#             alignment="right"
#             )
#         sub_payments_mod_queryset = SubPaymentModes.objects(status__in=[0,1]).order_by("-id")
#         if sub_paymentmode_search_element:
#             sub_payments_mod_queryset = sub_payments_mod_queryset.filter(Q(subPaymentModeType__icontains=sub_paymentmode_search_element))
#         length = sub_payments_mod_queryset.count()
#         sub_payments_mod_queryset=sub_payments_mod_queryset[page_start:page_end]

#         for each_sub_payment_mode in sub_payments_mod_queryset:
#             sub_payment_mode_data = fetching_sub_payment_mode_details(each_sub_payment_mode)
#             subPaymentsModeList.append(sub_payment_mode_data)

        
#         return render_template("super_admin_templates/payment_masters_list.html",
#             search_element=search_element,
#             subPaymentsModeList=subPaymentsModeList,
#             redirectval = redirectval
#             )
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to fetch payment masters details!!"
#         return render_template("super_admin_templates/payment_masters_list.html", 
#             error=error,
#             search_element=search_element,
#             paymentsModeList=paymentsModeList,
#             redirectval=redirectval,
#             )

# Update sub payment mode
@payment_master.route("/update_sub_payment_mode",methods=["POST","GET"])
def update_sub_payment_mode():
    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 = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    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(session.get("adminId"),"subpaymentmodePermissions")
    if "edit" in permissionsList:
        try:
            subPaymentModeId = request.args.get("subPaymentModeId","")
            if request.method == "POST":
                paymentModeId = request.form.get("paymentModeId","")
                subPaymentModeType = request.form.get("subPaymentModeType","")
                image = request.files.get("image","")

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

                if subPaymentModeId:
                    sub_payment_mode_queryset = SubPaymentModes.objects(id=subPaymentModeId,status__in=[0,1]).first()
                    existing_record = sub_payment_mode_queryset.to_json()

                    message=sub_payment_mode_queryset.adminId.userName+" "+subPaymentModeType+" Sub Payment mode updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_payment_mode","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)

                    if sub_payment_mode_queryset:
                        sub_payment_mode_queryset.update(
                            paymentModeId=ObjectId(paymentModeId),
                            subPaymentModeType=subPaymentModeType
                            )
                        if image:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/subpaymentMode/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/subpaymentMode/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/subpaymentMode/"+subPaymentModeId+".png"))
                            sub_payment_mode_queryset.update(image="media/subpaymentMode/"+subPaymentModeId+".png")

                        flash("Sub payment mode updated successfully!")
                        return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update payment mode details!!"
            return redirect(url_for("payment_master.sub_payment_modes_list",error=error))
    else:
        flash("Staff member does not have given update sub payment mode permissions!!")
        return redirect(url_for("payment_master.sub_payment_modes_list"))

# Update payment mode status
@payment_master.route("/update_sub_payment_status",methods=["POST","GET"])
def update_sub_payment_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:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    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)
    
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"subpaymentmodePermissions")
    if "edit" in permissionsList:
        subPaymentModeId = request.args.get("subPaymentModeId","")

        if subPaymentModeId:
            try:
                sub_payment_mode_queryset = SubPaymentModes.objects(id=subPaymentModeId,status__in=[0,1]).first()
                existing_record = sub_payment_mode_queryset.to_json()
                requestData = [existing_record]
                if sub_payment_mode_queryset:
                    if sub_payment_mode_queryset.status == 0:
                        sub_payment_mode_queryset.update(status=1)
                        flash("Sub payment mode activated successfully!")
                        message=sub_payment_mode_queryset.adminId.userName+" "+sub_payment_mode_queryset.subPaymentModeType+" Sub payment mode activated successfully!"
                    elif sub_payment_mode_queryset.status == 1:
                        sub_payment_mode_queryset.update(status=0)
                        flash("Sub payment mode deactivated successfully!")
                        message=sub_payment_mode_queryset.adminId.userName+" "+sub_payment_mode_queryset.subPaymentModeType+" Sub payment mode deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sub_payment_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
    else:
        flash("Staff member does not have given update status sub payment mode permissions!!")
        return redirect(url_for("payment_master.sub_payment_modes_list"))

# Delete payment mode account
@payment_master.route("/delete_sub_payment_mode",methods=["POST","GET"])
def delete_sub_payment_mode():
    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 = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    existing_record = ""
    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)

    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"subpaymentmodePermissions")
    if "delete" in permissionsList:
        subPaymentModeId = request.args.get("subPaymentModeId","")

        if subPaymentModeId:
            try:
                sub_payment_mode_queryset = SubPaymentModes.objects(id=subPaymentModeId,status__in=[0,1]).first()
                existing_record = sub_payment_mode_queryset.to_json()
                requestData = [existing_record]
                if sub_payment_mode_queryset:
                    sub_payment_mode_queryset.update(status=2)
                    flash("Sub payment mode deleted successfully!")
                    message=sub_payment_mode_queryset.adminId.userName+" "+sub_payment_mode_queryset.subPaymentModeType+" Sub payment mode deleted successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sub_payment_mode","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
                else:
                    flash("Invaild id!!")
                    message=sub_payment_mode_queryset.adminId.userName+" "+sub_payment_mode_queryset.subPaymentModeType+" Invaild details!"
                    return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("payment_master.sub_payment_modes_list",redirectto="SubPaymentMode"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("payment_master.sub_payment_modes_list"))
    else:
        flash("Staff member does not have given delete sub payment mode permissions!!")
        return redirect(url_for("payment_master.sub_payment_modes_list"))


# Add Config Payment Gateway
@payment_master.route("/add_config_payment_gateway",methods=["POST","GET"])
def add_config_payment_gateway():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            subPaymentModeId = request.form.get("subPaymentModeId","")
            transactionAPIId = request.form.get("transactionAPIId","")
            chargeType = request.form.get("chargeType","") # "Amount" or "Percentage"
            chargeValue = request.form.get("chargeValue",0)

            if subPaymentModeId and transactionAPIId and chargeType and chargeValue:
                try:
                    config_table = ConfigPaymentGateways(
                        adminId = adminId,
                        subPaymentModeId = subPaymentModeId,
                        transactionAPIId = transactionAPIId,
                        chargeType = chargeType,
                        chargeValue = chargeValue,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = config_table.save()
                    configPaymentGatewayId = str(save_table.id)

                    flash("Config payment gateway saved successfully!")
                    return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
                except Exception as e:
                    flash("Unable to save config payment gateway!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save config payment gateway!!"
        return render_template("super_admin_templates/payment_masters_list.html",error=error)


# Update sub payment mode
@payment_master.route("/update_config_payment_gateway",methods=["POST","GET"])
def update_config_payment_gateway():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        configPaymentGatewayId = request.args.get("configPaymentGatewayId","")
        if request.method == "POST":
            subPaymentModeId = request.form.get("subPaymentModeId","")
            transactionAPIId = request.form.get("transactionAPIId","")
            chargeType = request.form.get("chargeType","") # "Amount" or "Percentage"
            chargeValue = request.form.get("chargeValue",0)

            if configPaymentGatewayId:
                config_payment_gateway_queryset = ConfigPaymentGateways.objects(id=configPaymentGatewayId,status__in=[0,1]).first()
                if config_payment_gateway_queryset:
                    config_payment_gateway_queryset.update(
                        subPaymentModeId=ObjectId(subPaymentModeId),
                        transactionAPIId=ObjectId(transactionAPIId),
                        chargeType=chargeType,
                        chargeValue=chargeValue
                        )
                    flash("Config payment gate way updated successfully!")
                    return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update config payment gateway details!!"
        return redirect(url_for("payment_master.payment_masters_list",error=error))

# Update payment mode status
@payment_master.route("/update_config_payment_gateway_status",methods=["POST","GET"])
def update_config_payment_gateway_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    configPaymentGatewayId = request.args.get("configPaymentGatewayId","")

    if configPaymentGatewayId:
        try:
            config_payment_gateway_queryset = ConfigPaymentGateways.objects(id=configPaymentGatewayId,status__in=[0,1]).first()
            if config_payment_gateway_queryset:
                if config_payment_gateway_queryset.status == 0:
                    config_payment_gateway_queryset.update(status=1)
                    flash("Config payment gateway activated successfully!")
                elif config_payment_gateway_queryset.status == 1:
                    config_payment_gateway_queryset.update(status=0)
                    flash("Config payment gateway deactivated successfully!")
                return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
    else:
        flash("Required field is missing!!")
        return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))

# Delete payment mode account
@payment_master.route("/delete_config_payment_gateway",methods=["POST","GET"])
def delete_config_payment_gateway():
    if not session.get("adminId"):
        return redirect("admin_login")
    configPaymentGatewayId = request.args.get("configPaymentGatewayId","")

    if configPaymentGatewayId:
        try:
            config_payment_gateway_queryset = ConfigPaymentGateways.objects(id=configPaymentGatewayId,status__in=[0,1]).first()
            if config_payment_gateway_queryset:
                config_payment_gateway_queryset.update(status=2)
                flash("Config payment gateway deleted successfully!")
                return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("payment_master.payment_masters_list",redirectto="ConfigPayment"))
    else:
        flash("Required field is missing!!")
        return redirect(url_for("payment_master.payment_masters_list"))