import math
from appservices.common.util import *
from appservices.common.form_schemas import *
from appservices.common.payment_gateways.idfc_payment_gateways import *

api_master = Blueprint("api_master",__name__)

###################Transaction API################
# Add Transaction API
@api_master.route("/add_transaction_api",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_transaction_api():
    data_status = {"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        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,"apiGatewaysPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                action = request.form.get("action", "").strip()
                data = request.form.to_dict()

                otp_check_id = request.form.get("otpLogid", "")
                defaultVerificationId = request.form.get("defaultVerificationId", "")

                form = ApiManagementForm(request.form)
                if form.validate_on_submit():
                    print("otp_check_id",otp_check_id)
                    if not otp_check_id:
                        flash("Invalid Request.")
                        return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))

                    otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()

                    if not otpcheck_queryset:
                        flash("Invalid Request.")
                        return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))
                    # Update OTP status to 2 after verification
                    otpcheck_queryset.update(status=2)

                    apiName = request.form.get("apiName","")
                    perdayTransactionLimit = request.form.get("perdayTransactionLimit")
                    code = request.form.get("code","")
                    subCode = request.form.get("subCode","")
                    isActive = request.form.get("isActive")
                    isUserWise = request.form.get("isUserWise")
                    isSeamless = request.form.get("isSeamless")
                    priceType = request.form.get("priceType","")
                    virtualCode = request.form.get("virtualCode")
                    lastSixDigits = request.form.get("lastSixDigits")
                    autoSettlement = request.form.get("autoSettlement")
                    settlementLimit = request.form.get("settlementLimit",0)
                    cardBinEnable = request.form.get("cardBinEnable")
                    ifscCode = request.form.get("ifscCode")
                    preAuthorization = request.form.get("preAuthorization",False)
                    transactionType = request.form.get("transactionType","") # "Service" or "PaymentGateway" or "Payout"
                    invoiceType = request.form.get("invoiceType","") # "commission" or "PaymentGateway" or "amount"
                    inputKeyField = request.form.getlist("inputKeyField[]")
                    inputValueField = request.form.getlist("inputValueField[]")
                    form = ApiManagementForm(request.form)



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

                    if not perdayTransactionLimit:
                        perdayTransactionLimit=0
                    if not settlementLimit:
                        settlementLimit = 0

                    print("perdaaaaaaaaaaaaaaaa",perdayTransactionLimit, type(perdayTransactionLimit))

                    print(type(cardBinEnable),"((((((cardBinEnable))))))")
                    print(type(autoSettlement),"((((((autoSettlement))))))")

                    if len(inputKeyField) == len(inputValueField):
                        # Create a list of dictionaries
                        paramsList = [{'key': key, 'value': value} for key, value in zip(inputKeyField, inputValueField)]
                    else:
                        flash("Please give selected params values")
                        return redirect(url_for("api_master.api_masters_list"))

                    if apiName:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+apiName+" Transaction API created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_transaction_api","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                            if cardBinEnable == "True":
                                cardBinEnable = True
                                # Update all other records to set cardBinEnable to False
                                TransactionAPI.objects.update(cardBinEnable=False)
                            else:
                                cardBinEnable = False

                            if autoSettlement == "True":
                                autoSettlement = True
                            else:
                                autoSettlement = False

                            if preAuthorization == "True":
                                preAuthorization = True
                            else:
                                preAuthorization = False

                            transaction_table = TransactionAPI(
                                adminId=adminId,
                                apiName = apiName,
                                perdayTransactionLimit = perdayTransactionLimit,
                                code = code,
                                subCode = subCode,
                                virtualCode = virtualCode,
                                lastSixDigits = lastSixDigits,
                                cardBinEnable=cardBinEnable,
                                autoSettlement=autoSettlement,
                                preAuthorization=preAuthorization,
                                settlementLimit=float(settlementLimit),
                                ifscCode = ifscCode,
                                transactionType = transactionType,
                                invoiceType = invoiceType,
                                paramsList = paramsList,
                                isSeamless=isSeamless,
                                priceType=priceType,
                                createdOn = datetime.datetime.now(),
                                status = 1,
                                )
                            save_table = transaction_table.save()
                            transactionApiId = str(save_table.id)

                            if isActive == None:
                                save_table.update(isActive=False)
                            else:
                                save_table.update(isActive=True)

                            if isUserWise == None:
                                save_table.update(isUserWise=False)
                            else:
                                save_table.update(isUserWise=True)

                            flash("Transaction API saved successfully!")
                            data_status["responseStatus"] = 1
                            return data_status
                        except Exception as e:
                            flash("Unable to save transaction api!!")
                            app.logger.error(traceback.format_exc())
                            return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))
                    else:
                        flash("Required fields are missing!!")
                        
                        data_status["responseStatus"] = 4
                        return data_status
                else:
                    print("((((((form errrors))))))", form.errors)
                    data_status["result"] = form.errors
                    return data_status

        else:
            flash("The staff member does not have permission to create a Transaction API.", "danger")
            return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save transaction api!!"
        return render_template("super_admin_templates/api_master_list.html",error=error)

# View All Transaction API's
@api_master.route("/api_masters_list",methods=["POST","GET"])
@adminid_access_token_required
def api_masters_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    permissionsList = check_permissions(adminId,"apiGatewaysPermissions")
    pagination = ""
    search_element = ""
    page = 1,
    SnoCount = 0
    searchForm = ApiMasterFormSearch(request.args)
    if "view" in permissionsList:    
        transactionAPIList =[]
        

        try:
            redirectTo = request.args.get('redirectTo','')
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Transaction"

            search = False  
            search_element = request.args.get('search_element','')
            if not search_element:
                search_element = request.args.get("search_element","")
            if search_element:
                search = True

            page = request.args.get(get_page_parameter('page'), type=int, default=1)
            per_page = 20
            page_start = (page - 1) * per_page
            filters = Q(status__in=[0, 1])
            total_count =0
            # page_start,page_end=fetch_limit_length_based_on_page_index(page,10)
            # pagination = Pagination(
            #     page=page,
            #     record_name='api_master',
            #     per_page=10,
            #     alignment="right"
            #     )

             ######### categories list ############
            if searchForm.validate():
                if search_element:
                    filters &=Q(apiName__icontains=search_element)

                try:
                    total_count =  TransactionAPI.objects(filters).count()
                    temp = math.ceil(total_count/per_page)
                    if page>temp:
                        page_start =0
                        page = 1

                    transaction_apis_queryset = (
                        TransactionAPI.objects(filters)
                        .only("id","apiName", "code", "virtualCode","lastSixDigits", "ifscCode", "transactionType", "autoSettlement","settlementLimit","cardBinEnable","preAuthorization","isSeamless","priceType","invoiceType","status", "paramsList", "subCode", "perdayTransactionLimit")
                        .order_by("-id")
                        .skip(page_start)
                        .limit(per_page)
                        )
                    transactionAPIList = list(transaction_apis_queryset)

                except Exception as e:
                    print("Error during DB query:", e)
                    transactionAPIList = []
                    total_count = 0
            else:
                transactionAPIList = []
                total_count = 0
            
            SnoCount = page_start
            pagination = Pagination(
                    page=page,
                    total=total_count,
                    page_parameter="page",
                    record_name='api_masters_list',
                    per_page=per_page,
                    alignment="right",
                    href=f"?search_element={search_element}&page={{0}}"
                    )
            return render_template("super_admin_templates/api_master_list.html",
                search_element=search_element,
                transactionAPIList=transactionAPIList,
                pagination=pagination,
                redirectval = redirectval,
                form=searchForm,
                SnoCount=SnoCount,
                page = page,
                )

        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch transaction api details!!"
            return render_template("super_admin_templates/api_master_list.html",
                search_element=search_element,
                transactionAPIList=transactionAPIList,
                pagination=pagination,
                redirectval = redirectval,
                form = searchForm,
                SnoCount=SnoCount,
                page=page
                )
    else:
        flash("The staff member does not have permission to view transaction api.", "danger")
        return render_template("super_admin_templates/api_master_list.html")

# Update transaction api
@api_master.route("/update_transaction_api",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_transaction_api():
    data_status = {"responseStatus":0,"result":""}
    if not session.get("adminId"):
        return redirect("admin_login")
    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"),"apiGatewaysPermissions")
    if "edit" in permissionsList:
        try:
            transactionApiId = request.args.get("transactionApiId","")
            if request.method == "POST":
                action = request.form.get("action", "").strip()
                data = request.form.to_dict()
              
               
                otp_check_id = request.form.get("otpLogid", "")
                defaultVerificationId = request.form.get("defaultVerificationId", "")

                print("otp_check_id",otp_check_id)
                if not otp_check_id:
                    flash("Invalid Request.")
                    return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))

                
                form = ApiManagementForm(request.form)
                if form.validate_on_submit():
                    otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()

                    if not otpcheck_queryset:
                        flash("Invalid Request.")
                        return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))
                    # Update OTP status to 2 after verification
                    otpcheck_queryset.update(status=2)

                    apiName = request.form.get("apiName","")
                    perdayTransactionLimit = request.form.get("perdayTransactionLimit","")
                    isActive = request.form.get("isActive")
                    isUserWise = request.form.get("isUserWise")
                    transactionType = request.form.get("transactionType","")
                    invoiceType = request.form.get("invoiceType","")
                    virtualCode = request.form.get("virtualCode","")
                    lastSixDigits = request.form.get("lastSixDigits","")
                    ifscCode = request.form.get("ifscCode","")
                    subCode = request.form.get("subCode","")
                    isSeamless = request.form.get("isSeamless")
                    priceType = request.form.get("priceType","")
                    autoSettlement = request.form.get("autoSettlement")
                    settlementLimit = request.form.get("settlementLimit",0)
                    cardBinEnable = request.form.get("cardBinEnable")
                    preAuthorization = request.form.get("preAuthorization")
                    defaultTransactionAPI = request.form.get("defaultTransactionAPI")

                    inputKeyField = request.form.getlist("inputKeyField[]")
                    inputValueField = request.form.getlist("inputValueField[]")
                    

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

                    if not settlementLimit:
                        settlementLimit = 0
                
                    # if apiName and not is_valid_alphanumeric(apiName):
                    #     flash("API Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
                    #     return redirect(url_for("api_master.api_masters_list"))

                    # if subCode and not is_valid_alphanumeric(subCode,True): ### sescond param is for space check here we want space so its true
                    #     flash("subCode must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
                    #     return redirect(url_for("api_master.api_masters_list"))

                    # if perdayTransactionLimit and not is_valid_txn_limit(perdayTransactionLimit):
                    #     flash("Invalid Txn Limit. Please enter a valid number")
                    #     return redirect(url_for("api_master.api_masters_list"))

                    # # if transactionType == "Payout":
                    # if virtualCode and not is_valid_alphanumeric(virtualCode):
                    #     flash("Virtual Code must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
                    #     return redirect(url_for("api_master.api_masters_list"))

                    # if lastSixDigits and not is_valid_alphanumeric(lastSixDigits):
                    #     flash("Escro Account Number must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
                    #     return redirect(url_for("api_master.api_masters_list"))

                    # if ifscCode and not is_valid_ifsc_code(ifscCode):
                    #     flash("IFSC Code must follow the format: 4 letters, 1 digit, and 6 alphanumeric characters!")
                    #     return redirect(url_for("api_master.api_masters_list"))

                    # if settlementLimit and not is_valid_txn_limit(settlementLimit):
                    #     flash("Invalid settlement Limit. Please enter a valid number")
                    #     return redirect(url_for("api_master.api_masters_list"))
                    
                    if len(inputKeyField) == len(inputValueField):
                        # Create a list of dictionaries
                        paramsList = [{'key': key, 'value': value} for key, value in zip(inputKeyField, inputValueField)]
                    else:
                        flash("Please give selected params values")
                        data_status["responseStatus"] = 4
                        return data_status

                    transaction_api_queryset = TransactionAPI.objects(id=transactionApiId,status__nin=[2]).first()
                    existing_record = transaction_api_queryset.to_json()

                    message=transaction_api_queryset.adminId.userName+" "+apiName+" Transaction API updated successfully!"
                    requestData=[existing_record]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_transaction_api","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)

                    if transaction_api_queryset:
                        if cardBinEnable == "True":
                            cardBinEnable = True
                            # Update all other records to set cardBinEnable to False
                            TransactionAPI.objects(status__in=[0, 1]).update(cardBinEnable=False)
                        else:
                            cardBinEnable = False

                        if autoSettlement == "True":
                            autoSettlement = True
                        else:
                            autoSettlement = False

                        if isSeamless == "True":
                            isSeamless = True
                        else:
                            isSeamless = False

                        if preAuthorization == "True":
                            preAuthorization = True
                        else:
                            preAuthorization = False
                        
                        transaction_api_queryset.update(
                            apiName = apiName,
                            perdayTransactionLimit = perdayTransactionLimit,
                            virtualCode = virtualCode,
                            lastSixDigits=lastSixDigits,
                            ifscCode = ifscCode,
                            subCode = subCode,
                            cardBinEnable=cardBinEnable,
                            preAuthorization=preAuthorization,
                            autoSettlement=autoSettlement,
                            settlementLimit=float(settlementLimit),
                            transactionType = transactionType,
                            invoiceType = invoiceType,
                            paramsList = paramsList,
                            isSeamless=isSeamless,
                            priceType=priceType
                            )
                        if isActive == None:
                            transaction_api_queryset.update(isActive=False)
                        else:
                            transaction_api_queryset.update(isActive=True)

                        if isUserWise == None:
                            transaction_api_queryset.update(isUserWise=False)
                        else:
                            transaction_api_queryset.update(isUserWise=True)

                        flash("Transaction API updated successfully!")
                        data_status["responseStatus"]=1
                        return data_status
                    else:
                        flash("Invaild id!!")
                        data_status["responseStatus"] = 4
                        return data_status
                else:
                    print("((((((form errrors))))))", form.errors)
                    data_status["result"] = form.errors
                    return data_status

            return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update transaction api!!"
            data_status["responseStatus"] = 4
            return data_status
    else:
        app.logger.error(traceback.format_exc())
        flash("The staff member does not have permission to update Transaction API.", "danger")
        data_status["responseStatus"] = 4
        return data_status


# Update transaction api status
@api_master.route("/update_transaction_api_status",methods=["POST","GET"])
@adminid_access_token_required
def update_transaction_api_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    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]

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

    actionDate=datetime.datetime.now()

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

    existing_record = ""
    updatedrequestData = [jsonData]
    
    permissionsList = check_permissions(session.get("adminId"),"apiGatewaysPermissions")
    if "edit" in permissionsList:
        transactionApiId = request.args.get("transactionApiId","")
        page = request.args.get(get_page_parameter('page'), type=int, default=1)
        search_element = request.args.get('search_element','')
        redirectTo = url_for("api_master.api_masters_list",redirectTo="Transaction", page=page, search_element=search_element)
        if transactionApiId:
            try:
                transaction_api_queryset = TransactionAPI.objects(id=transactionApiId,status__nin=[2]).first()
                existing_record = transaction_api_queryset.to_json()
                requestData = [existing_record]
                if transaction_api_queryset:
                    if transaction_api_queryset.status == 0:
                        transaction_api_queryset.update(status=1)
                        flash("Transaction API activated successfully!")
                        message=transaction_api_queryset.adminId.userName+" "+transaction_api_queryset.apiName+" Transaction API activated successfully!"
                    elif transaction_api_queryset.status == 1:
                        transaction_api_queryset.update(status=0)
                        flash("Transaction API deactivated successfully!")
                        message=transaction_api_queryset.adminId.userName+" "+transaction_api_queryset.apiName+" Transaction API deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_transaction_api_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    return redirect(redirectTo)
                else:
                    flash("Invaild id!!")
                    return redirect(redirectTo)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            return redirect(redirectTo)
    else:
        flash("The staff member does not have permission to update Transaction API status.", "danger")
        return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))

# Delete Transaction API
@api_master.route("/delete_transaction_API",methods=["GET"])
@adminid_access_token_required
def delete_transaction_API():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        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]

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

        actionDate=datetime.datetime.now()

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

        existing_record = ""
        updatedrequestData = [jsonData]

        if request.method == "GET":
            transactionApiId = request.args.get("transactionApiId","")
            transaction_api_queryset = TransactionAPI.objects(id=categoryId,status__in=[0,1]).first()
            existing_record = transaction_api_queryset.to_json()
            requestData = [existing_record]
            transaction_api_queryset.update(status=2)
            flash("Transaction API deleted successfully!")
            message=transaction_api_queryset.adminId.userName+" "+transaction_api_queryset.apiName+" Transaction API deleted successfully!"
            save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_transaction_API","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
            return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete transaction api!!")
        return redirect(url_for("api_master.api_masters_list",redirectTo="Transaction"))

@api_master.route("/get_payout_total_balance",methods=["POST","GET"])
@adminid_access_token_required
def get_payout_total_balance():
    if not session.get("adminId"):
        return redirect("admin_login")
    merchant_total_pending_payout=0
    merchant_total_pending_payin=0
    permissionsList = check_permissions(session.get("adminId"),"fundSourcesPermissions")
    if "view" in permissionsList:
        try:
            if request.method == "GET":
                payoutsList = []
                merchant_total_pending_payout = Users.objects().sum('payoutBalance')
                merchant_total_pending_payin = Users.objects().sum('walletBalance')
                transaction_apis_queryset = TransactionAPI.objects(transactionType="Payout",status__in=[0,1]).order_by("-id").all()
                for each_payout in transaction_apis_queryset:
                    admin_balance_queryset = AdminPayoutBalances.objects(apiTransactionId=str(each_payout.id)).first()
                    if admin_balance_queryset:
                        previousBalance = admin_balance_queryset.previousBalance
                        currentBalance = admin_balance_queryset.currentBalance
                        updatedOn = admin_balance_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
                    else:
                        previousBalance = 0
                        currentBalance = 0
                        updatedOn = ""
                    payoutDict = {
                    "id":str(each_payout.id),
                    "apiName":each_payout.apiName,
                    "transactionType":each_payout.transactionType,
                    "updatedOn":updatedOn,
                    "previousBalance":previousBalance,
                    "currentBalance":"{:.2f}".format(float(currentBalance))
                    }
                    payoutsList.append(payoutDict)
                return render_template("super_admin_templates/fund_sources_list.html",payoutsList=payoutsList,merchant_total_pending_payout="{:.2f}".format(float(merchant_total_pending_payout)),merchant_total_pending_payin="{:.2f}".format(float(merchant_total_pending_payin)))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to get payout total balance!!")
            return redirect(url_for("api_master.get_payout_total_balance"))
    else:
        flash("The staff member does not have permission to view Payout balances.", "danger")
        return render_template("super_admin_templates/fund_sources_list.html",merchant_total_pending_payout=merchant_total_pending_payout,merchant_total_pending_payin=merchant_total_pending_payin)


@api_master.route("/get_payout_balance",methods=["POST","GET"])
@adminid_access_token_required
def get_payout_balance():
    apiId = request.args.get("apiId","")
    try:
        print("*****get_payout_balance*****")
        if not apiId:
            flash("Required fields are missing!!")
            return redirect(url_for("api_master.get_payout_total_balance"))

        api_queryset = TransactionAPI.objects(id=apiId).first()
        if not api_queryset:
            flash("Invaild api id!!")
            return redirect(url_for("api_master.get_payout_total_balance"))
        balance_check=payout_balance_check(apiId)
        return redirect(url_for("api_master.get_payout_total_balance"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to get payout balance!!")
        return redirect(url_for("api_master.get_payout_total_balance"))


@api_master.route("/dynamic_apis_list",methods=["POST","GET"])
@adminid_access_token_required
def dynamic_apis_list():
    data_status = {"responseStatus":0,"result":""}
    apisList = []
    try:
        walletType = request.form.get("walletType")
        apis_queryset = TransactionAPI.objects(transactionType=walletType,status=1).order_by('-id')
        for each_api in apis_queryset:
            apiDict = fetching_transaction_api_details(each_api)
            apisList.append(apiDict)

        data_status["responseStatus"]=1
        data_status["result"]="Success"
        data_status["apisList"]=apisList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unsuccess!!"
        return data_status

@api_master.route("/api_switches_list",methods=["POST","GET"])
@adminid_access_token_required
def api_switches_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    patternsList = []
    walletType = ""
    apiId = ""
    switchapiId = ""
    
    adminId = session.get("adminId")
    try:
        redirectTo = request.args.get("redirectTo","ApiSwitch")
        if redirectTo:
            redirectval = redirectTo
        else:
            redirectval = "ApiSwitch"

        walletType = request.form.get("walletType","")
        profileIdsList = request.form.getlist("profileIdsList[]")
        apiId = request.form.get("apiId","")
        switchapiId = request.form.get("switchapiId","")

        # print(walletType,"((((((walletType))))))")
        # print(profileIdsList,"((((((profileIdsList))))))")
        # print(apiId,"((((((apiId))))))")
        # print(switchapiId,"((((((switchapiId))))))")
        
        if request.method == "GET":
            patterns_queryset = Patterns.objects(status__in=[0,1]).order_by("-id").all()
            for each_pattern in patterns_queryset:
                pattern_dict = fetching_pattern_details(each_pattern)
                patternsList.append(pattern_dict)
            return render_template("super_admin_templates/api_switches_list.html",patternsList=patternsList)

        if request.method == "POST":
            if walletType and profileIdsList and apiId and switchapiId:
                profiles_queryset = Patterns.objects(id__in=profileIdsList).order_by("-id")
                if walletType == "PaymentGateway":
                    for each_profile in profiles_queryset:
                        each_profile.update(defaultPayinPaymentGatewayId=ObjectId(switchapiId))
                else:
                    for each_profile in profiles_queryset:
                        each_profile.update(payoutPaymentGatewayId=ObjectId(switchapiId))
                flash("API switched successfully!")
                return render_template("super_admin_templates/api_switches_list.html",
                    walletType=walletType,
                    apiId=apiId,
                    switchapiId=switchapiId,
                    patternsList=patternsList,
                    redirectval=redirectval
                    )
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("api_master.api_switches_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch api switches details!!"
        return render_template("super_admin_templates/api_switches_list.html", 
            error=error,
            walletType=walletType,
            apiId=apiId,
            switchapiId=switchapiId,
            patternsList=patternsList,
            redirectval=redirectval
            )