from appservices.common.util import *
from appservices.common.form_schemas import *


payment_master = Blueprint("payment_master",__name__)
  

# Add Payment Mode
@payment_master.route("/add_payment_mode",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_payment_mode():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            flash("session expired.Please login again.")
            data_status["responseStatus"]=4
            return data_status
        adminId = session.get("adminId")
        
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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
                priority = request.form.get("priority","") 
                image = request.files.get("image")
                print(image,"(((((((((((image@@@@@@@@@@@@)))))))))))")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                form = PaymentModeForm()
                if form.validate_on_submit():

                    if paymentMode and walletType and hasGroup and groupType and priority:
                        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,latitude,longitude)

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

                            if image:
                                print(image,"(((((((((((IMAGE IN PAYMENTMODE)))))))))))")
                                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!", "success")
                            data_status['responseStatus']=1
                            return data_status
                            
                        except Exception as e:
                            flash("Unable to save wallet!!", "danger")
                            data_status['responseStatus']=4
                            return data_status
                            
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status
                else:
                    data_status['result']=form.errors
                    return data_status
            else:
                flash("Invalid request.")
                data_status['responseStatus']=4
                return data_status
                    
        else:
            flash("Staff member does not have given create payment mode permissions!!", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save payment mode!!"
        flash(error)
        data_status['responseStatus']=4
        return data_status

@payment_master.route("/payment_masters_list",methods=["POST","GET"])
@adminid_access_token_required
def payment_masters_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    paymentsModeList = []
    subPaymentsModeList = []
    configPaymentGatewaysList = []
    transactionAPIsList = []
    pagination = None
    search_element=""
    sub_paymentmode_search_element=""
    snoCount=0
    paymentMode = ""
    walletType = ""
    page = ""
    error = ""
    redirectval = ""
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"paymentMasterPermissions")
    form = PaymentModeFormSearch(request.args)
    if "view" in permissionsList:
        try:
            redirectto = request.args.get('redirectto','PaymentMode')
            if redirectto:
                redirectval=redirectto
            else:
                redirectval="PaymentMode"
            # form = PaymentModeFormSearch(request.args)
            # search_element = request.args.get("search_element","")

            # if search_element:
            #     if form.validate():  
            #         search_element = form.search_element.data.strip()
            #     else:
            #         flash(f"{form.errors}", "danger")
            #         search_element = ""
            

            paymentMode = request.args.get("paymentMode", "").strip()
            walletType = request.args.get("walletType", "").strip()

            

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

            # payments_mod_queryset = PaymentMode.objects(status__in=[0,1]).order_by("-id")
            # if search_element:
            #     payments_mod_queryset = payments_mod_queryset.filter(Q(paymentMode__icontains=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)

            page = request.args.get(get_page_parameter(), type=int, default=1)
            per_page = 20
            start = (page - 1) * per_page

            total_count=0


            filters = Q(status__in=[0, 1])
            if form.validate():
                if paymentMode:
                    filters &= Q(paymentMode__icontains=paymentMode)
                if walletType:
                    filters &= Q(walletType__icontains=walletType)

                total_count = PaymentMode.objects(filters).count()
                payments_mod_queryset = (
                    PaymentMode.objects(filters)
                    .only("id", "paymentMode", "walletType","status","priority","image","hasGroup","groupType")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                paymentsModeList=list(payments_mod_queryset)
            else:
                print("form errors",form.errors)
                paymentsModeList = []
               


            snoCount = start
            
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="payment", href=f"?paymentMode={paymentMode}&walletType={walletType}&page={{0}}")
            

            ################# 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",
                domain=domain,
                pagination=pagination,
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                configPaymentGatewaysList=configPaymentGatewaysList,
                transactionAPIsList=transactionAPIsList,
                search_element=search_element,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval,
                paymentMode=paymentMode,
                walletType=walletType,
                page=page,
                snoCount=snoCount,
                form=form
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to fetch payment modes.", "danger")
            return render_template("super_admin_templates/payment_masters_list.html", 
                error=error,
                pagination=pagination,
                domain=domain,
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                configPaymentGatewaysList=configPaymentGatewaysList,
                transactionAPIsList=transactionAPIsList,
                search_element=search_element,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval,
                paymentMode=paymentMode,
                walletType=walletType,
                page=page,
                snoCount=snoCount,
                form=form
                )
    else:
        flash("Staff member does not have given view payment mode permissions!!", "danger")
        return redirect(url_for("admin.dashboard"))
        


# Update payment mode
@payment_master.route("/update_payment_mode",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_payment_mode():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session Expired.")
        data_status["responseStatus"]=4
        return data_status
    adminId=session.get("adminId")
    
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")   
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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
                priority = request.form.get("priority","") 
                image = request.files.get("image")
                print(image,"((((((((((images))))))))))")

                jsonData = request.form.to_dict(flat=True)
                form = PaymentModeForm(request.form, current_id=paymentModeId)
                if form.validate_on_submit():

                    if paymentModeId and paymentMode and walletType and hasGroup and groupType and priority:
                        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,latitude,longitude)

                        if payment_mode_queryset:
                            payment_mode_queryset.update(
                                paymentMode=paymentMode,
                                walletType=walletType,
                                hasGroup = hasGroup,
                                groupType = groupType,
                                priority = priority,
                                )
                            if image:
                                randomUniqueId = str(random_digit_generate(15))
                                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/"+randomUniqueId+".png"))
                                payment_mode_queryset.update(image="media/paymentMode/"+randomUniqueId+".png")

                            flash("Payment mode updated successfully!", "success")
                            data_status["responseStatus"]=1
                            return data_status
                            
                        else:
                            flash("Invaild id!!")
                            data_status["responseStatus"]=4
                            return data_status
                           
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="required fields are missing."
                        return data_status
                else:
                    data_status["result"]=form.errors
                    return data_status
            else:
                flash("Invalid request.")
                data_status["responseStatus"]=4
                return data_status
        else:
            flash("Staff member does not have given update payment mode permissions!!", "danger")
            data_status["responseStatus"]=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update payment mode details!!"
        flash(error)
        data_status["responseStatus"]=4
        return data_status
        

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

    page=request.args.get("page")
    paymentMode = request.args.get("paymentMode")
    walletType = request.args.get("walletType")
    redirectTo=url_for("payment_master.payment_masters_list",page=page,paymentMode=paymentMode,walletType=walletType)
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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!", "success")
                        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!", "success")
                        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,latitude,longitude)
                    return redirect(redirectTo)
                    
                else:
                    flash("Invalid ID provided.", "danger")
                    return redirect(url_for(redirectTo))
                    
            except Exception as e:
                flash("Unable to update the status", "danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
                
        else:
            return redirect(redirectTo)
            
    else:
        flash("Staff member does not have given update status payment mode permissions!!","danger")
        return redirect(redirectTo)

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

    page=request.args.get("page")
    paymentMode = request.args.get("paymentMode")
    walletType = request.args.get("walletType")
    redirectTo=url_for("payment_master.payment_masters_list",page=page,paymentMode=paymentMode,walletType=walletType)
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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!", "success")
                    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,latitude,longitude)
                    return redirect(redirectTo)
                else:
                    flash("Invaild id!!","danger")
                    return redirect(redirectTo)
                
            except Exception as e:
                app.logger.error(traceback.format_exc())
                flash("Unable to delete the Payment Mode. Please try again.", "danger")
                return redirect(redirectTo)       
        else:
            flash("Required field is missing!!","danger")
            return redirect(redirectTo)
            
    flash("Staff member does not have given delete payment mode permissions!!","danger")
    return redirect(redirectTo)




@payment_master.route("/sub_payment_modes_list",methods=["POST","GET"])
@adminid_access_token_required
def sub_payment_modes_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    paymentsModeList = []
    subPaymentsModeList = []
    configPaymentGatewaysList = []
    transactionAPIsList = []
    filters = ""
    pagination = None
    sub_paymentmode_search_element = ""
    subPaymentModeType = ""
    paymentModeId = ""
    page = ""
    snoCount=0
    error =""
    redirectval = ""
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"subpaymentmodePermissions")
    form = SubPaymentModeFormSearch(request.args)
    if "view" in permissionsList:
        try:
            redirectto = request.args.get('redirectto','SubPaymentMode')
            if redirectto:
                redirectval=redirectto
            else:
                redirectval="SubPaymentMode"

            subPaymentModeType = request.args.get("subPaymentModeType", "")
            paymentModeId = request.args.get("paymentModeId", "")

            # sub_paymentmode_search_element = request.args.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)
        
            # payments_mods_queryset = (
            #     PaymentMode.objects(filters)
            #     .only("id","paymentMode")
            #     .order_by("-id")
            # )
            # paymentsModeList=list(payments_mods_queryset)

            # if subPaymentModeType:
            #     matching_subs = SubPaymentModes.objects(
            #         Q(subPaymentModeType__icontains=subPaymentModeType)
            #     ).only("paymentModeId")

            #     matched_payment_ids = list(set(
            #         str(sub.paymentModeId.id)
            #         for sub in matching_subs
            #         if sub.paymentModeId
            #     ))

            #     payments_mods_queryset = PaymentMode.objects(id__in=matched_payment_ids).only("id", "paymentMode").order_by("-id")
            # else:
            #     payments_mods_queryset = PaymentMode.objects().only("id", "paymentMode").order_by("-id")
            payments_mods_queryset = PaymentMode.objects(status=1).only("id", "paymentMode").order_by("-id")
            paymentsModeList = list(payments_mods_queryset)

            ################# 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)
            page = request.args.get(get_page_parameter(), type=int, default=1)
            per_page = 20
            start = (page - 1) * per_page

            total_count=0


            filters = Q(status__in=[0, 1])
            if form.validate():
                if subPaymentModeType:
                    filters &= Q(subPaymentModeType__icontains=subPaymentModeType)
                if paymentModeId:
                    filters &= Q(paymentModeId=paymentModeId)

                total_count = SubPaymentModes.objects(filters).count()
            
                sub_payments_mod_queryset = (
                    SubPaymentModes.objects(filters)
                    .only("id", "paymentModeId", "subPaymentModeType","status","priority","image","minAmount","maxAmount")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                subPaymentsModeList=list(sub_payments_mod_queryset)
                
            else:
                print("form errors",form.errors)
                subPaymentsModeList=[]
                

            snoCount = start
          
            pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="subpayment", href=f"?subPaymentModeType={subPaymentModeType}&paymentModeId={paymentModeId}&page={{0}}")
                            
            # 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",
                domain=domain,
                pagination=pagination,
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                # transactionAPIsList=transactionAPIsList,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval,
                page=page,
                snoCount=snoCount,
                subPaymentModeType=subPaymentModeType,
                paymentModeId=paymentModeId,
                form=form,
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to fetch sub payment modes.", "danger")
            return render_template("super_admin_templates/sub_payment_modes_list.html", 
                error=error,
                domain=domain,
                pagination=pagination,
                paymentsModeList=paymentsModeList,
                subPaymentsModeList=subPaymentsModeList,
                # transactionAPIsList=transactionAPIsList,
                sub_paymentmode_search_element=sub_paymentmode_search_element,
                redirectval=redirectval,
                page=page,
                snoCount=snoCount,
                subPaymentModeType=subPaymentModeType,
                paymentModeId=paymentModeId,
                form=form,
                )
    else:
        flash("Staff member does not have given view sub payment mode permissions!!", "danger")
        return redirect(url_for("admin.dashboard"))
        

# Add Sub Payment Mode
@payment_master.route("/add_sub_payment_mode",methods=["POST","GET"])
@csrf_protect
@adminid_access_token_required
def add_sub_payment_mode():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            flash("session expired.Please login again.")
            data_status["responseStatus"]=4
            return data_status
        adminId = session.get("adminId")
        
        csrf_token = request.form.get("csrf_token")
        print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        print("LAT:", latitude, "LONG:", longitude)
        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","")
                priority = request.form.get("priority","")
                minAmount = request.form.get("minAmount",0)
                maxAmount = request.form.get("maxAmount",0)
                image = request.files.get("image")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]
                form = SubPaymentModeForm()
                if form.validate_on_submit():
                    if paymentModeId and subPaymentModeType and priority and minAmount and maxAmount:
                        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,latitude,longitude)

                            sub_payment_mode_table = SubPaymentModes(
                                adminId = adminId,
                                paymentModeId = paymentModeId,
                                subPaymentModeType = subPaymentModeType,
                                priority = priority,
                                minAmount = minAmount,
                                maxAmount = maxAmount,
                                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!", "success")
                            data_status['responseStatus']=1
                            return data_status
                            
                        except Exception as e:
                            app.logger.error(traceback.format_exc())
                            flash("Unable to save sub paymentmode!!","danger")
                            data_status['responseStatus']=4
                            return data_status
                           
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status
                else:
                    data_status['result']=form.errors
                    return data_status
            else:
                data_status['responseStatus']=4
                return data_status
        else:
            flash("Staff member does not have given create sub payment mode permissions!!","danger")
            data_status['responseStatus']=4
            return data_status
            
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to save sub payment mode", "danger")
        data_status['responseStatus']=4
        return data_status
        



# # 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"])
@adminid_access_token_required
@csrf_protect
def update_sub_payment_mode():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session Expired.")
        data_status["responseStatus"]=4
        return data_status
    adminId=session.get("adminId") 
    
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")  
    latitude = request.form.get("latitude", "")
    longitude = request.form.get("longitude", "")
    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","")
                priority = request.form.get("priority",0)
                minAmount = request.form.get("minAmount",0)
                maxAmount = request.form.get("maxAmount",0)
                image = request.files.get("image","")

                jsonData = request.form.to_dict(flat=True)
                form = SubPaymentModeForm(request.form, current_id=subPaymentModeId)
                if form.validate_on_submit():

                    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,latitude,longitude)

                        if sub_payment_mode_queryset:
                            sub_payment_mode_queryset.update(
                                paymentModeId=ObjectId(paymentModeId),
                                subPaymentModeType=subPaymentModeType,
                                priority=priority,
                                minAmount=minAmount,
                                maxAmount=maxAmount,
                                )
                            if image:
                                randomUniqueId = str(random_digit_generate(15))
                                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/"+randomUniqueId+".png"))
                                sub_payment_mode_queryset.update(image="media/subpaymentMode/"+randomUniqueId+".png")

                            flash("Sub payment mode updated successfully!", "success")
                            data_status["responseStatus"]=1
                            return data_status
                            
                        else:
                            flash("Invaild id!!")
                            data_status["responseStatus"]=4
                            return data_status
                            
                    else:
                        data_status["responseStatus"]=2
                        data_status["result"]="required fields are missing."
                        return data_status
                else:
                    data_status["result"]=form.errors
                    return data_status    
            else:
                data_status["responseStatus"]=4
                return data_status    
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update payment mode details!!", "danger")
            data_status["responseStatus"]=4
            return data_status
            
    else:
        flash("Staff member does not have given update sub payment mode permissions!!", "danger")
        data_status["responseStatus"]=4
        return data_status
   

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

    page=request.args.get("page")
    subPaymentModeType = request.args.get("subPaymentModeType")
    paymentModeId = request.args.get("paymentModeId")
    redirectTo=url_for("payment_master.sub_payment_modes_list",page=page,subPaymentModeType=subPaymentModeType,paymentModeId=paymentModeId)
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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!", "success")
                        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!", "success")
                        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,latitude,longitude)
                    return redirect(redirectTo)
                else:
                    flash("Invaild id!!", "danger")
                    return redirect(url_for(redirectTo))
                    
            except Exception as e:
                flash("Unable to update the status", "danger")
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
                
        else:
            return redirect(redirectTo)
    else:
        flash("Staff member does not have given update status sub payment mode permissions!!","danger")
        return redirect(redirectTo)
        

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

    page=request.args.get("page")
    subPaymentModeType = request.args.get("subPaymentModeType")
    paymentModeId = request.args.get("paymentModeId")
    redirectTo=url_for("payment_master.sub_payment_modes_list",page=page,subPaymentModeType=subPaymentModeType,paymentModeId=paymentModeId)
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    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!","success")
                    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,latitude,longitude)
                    return redirect(redirectTo)
                else:
                    flash("Invalid ID provided.", "danger")
                    message=sub_payment_mode_queryset.adminId.userName+" "+sub_payment_mode_queryset.subPaymentModeType+" Invaild details!"
                    return redirect(redirectTo)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                flash("Unable to delete the sub Payment Mode. Please try again.", "danger")
                return redirect(redirectTo)  
                
        else:
            flash("Required field is missing!!","danger")
            return redirect(redirectTo)
           
    else:
        flash("Staff member does not have given delete sub payment mode permissions!!", "danger")
        return redirect(redirectTo)
        


# Add Config Payment Gateway
@payment_master.route("/add_config_payment_gateway",methods=["POST","GET"])
@adminid_access_token_required
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"])
@adminid_access_token_required
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"])
@adminid_access_token_required
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"])
@adminid_access_token_required
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"))