from appservices.common.util import *
testing_apis = Blueprint("testing_apis",__name__)

csrf.exempt(testing_apis)

@testing_apis.route("/test_accurepay_payout_call_back_url", methods=["POST"])
def test_accurepay_payout_call_back_url():
    data_status = {"responseStatus": 0, "result": ""}
    transaction_reference_number = request.json.get("transaction_reference_number","")
    status = request.json.get("status","")
    error_message = request.json.get("error_message","")
    bank_reference_number = request.json.get("bank_reference_number","")
    merchant_reference_number = request.json.get("merchant_reference_number","")
    transaction_date = request.json.get("transaction_date","")
    transaction_amount = request.json.get("transaction_amount","")
    api_key = request.json.get("api_key","")
    hashValue = request.json.get("hash","")
    respnseDict = {}
    try:
        if merchant_reference_number:
            fund_transfer_queryset = FundTransfers.objects(pgOrderId=merchant_reference_number).first()
            if not fund_transfer_queryset:
                data_status["result"]="Invalid merchant reference number!!"
                return data_status

            payoutResponseCallBackData = []

            payoutResponseCallBackData = [
            {
            "transaction_reference_number":transaction_reference_number,
            "status":status,
            "error_message":error_message,
            "bank_reference_number":bank_reference_number,
            "merchant_reference_number":merchant_reference_number,
            "transaction_date":transaction_date,
            "transaction_amount":transaction_amount,
            "api_key":api_key,
            "hash":hashValue
            }
            ]
            user_queryset = Users.objects(id=str(fund_transfer_queryset.userId.id),status__in=[1]).first()
            actuallBalance = user_queryset.payoutBalance
            payout_balance_queryset = PayoutBalances.objects(userId=str(fund_transfer_queryset.userId.id),transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)).first()
            previousBalance=payout_balance_queryset.currentBalance
            if status == "SUCCESS":
                updateAmount = float(actuallBalance)-float(transaction_amount)
                payoutCurrentBalance=float(previousBalance)-float(transaction_amount)
                if fund_transfer_queryset.status==0:
                    fund_transfer_queryset.update(
                    payoutResponseCallBackData=payoutResponseCallBackData,
                    responseCallBackTime=datetime.datetime.now(),
                    previousBalance=actuallBalance,
                    currentBalance=updateAmount,
                    status=1
                    )
                    user_queryset.update(payoutBalance = updateAmount)
                    payout_balance_queryset.update(previousBalance=previousBalance,currentBalance=payoutCurrentBalance,updatedOn=datetime.datetime.now())
                else:
                    fund_transfer_queryset.update(
                    payoutResponseCallBackData=payoutResponseCallBackData,
                    responseCallBackTime=datetime.datetime.now(),
                    status=1
                    )
            elif status == "PROCESSING":
                updateAmount = float(actuallBalance)-float(transaction_amount)
                payoutCurrentBalance=float(previousBalance)-float(transaction_amount)
                if fund_transfer_queryset.status!=0:
                    fund_transfer_queryset.update(
                        payoutResponseCallBackData=payoutResponseCallBackData,
                        responseCallBackTime=datetime.datetime.now(),
                        status=2
                        )
                else:
                    fund_transfer_queryset.update(
                        payoutResponseCallBackData=payoutResponseCallBackData,
                        responseCallBackTime=datetime.datetime.now(),
                        previousBalance=actuallBalance,
                        currentBalance=updateAmount,
                        status=2
                        )
                    user_queryset.update(payoutBalance = updateAmount)
                    payout_balance_queryset.update(previousBalance=previousBalance,currentBalance=payoutCurrentBalance,updatedOn=datetime.datetime.now())

            else:
                updateAmount = float(actuallBalance)+float(transaction_amount)
                payoutCurrentBalance=float(previousBalance)+float(transaction_amount)
                if fund_transfer_queryset.status==0:
                    fund_transfer_queryset.update(
                        payoutResponseCallBackData=payoutResponseCallBackData,
                        responseCallBackTime=datetime.datetime.now(),
                        status=0
                        )
                else:
                    fund_transfer_queryset.update(
                        payoutResponseCallBackData=payoutResponseCallBackData,
                        responseCallBackTime=datetime.datetime.now(),
                        previousBalance=actuallBalance,
                        currentBalance=updateAmount,
                        status=0
                        )
                    user_queryset.update(payoutBalance = updateAmount)
                    payout_balance_queryset.update(previousBalance=previousBalance,currentBalance=payoutCurrentBalance,updatedOn=datetime.datetime.now())
            data_status["responseStatus"] = 1
            data_status["result"] = "Pay Out call back url was successful!"
            data_status["responseBody"] = respnseData
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to pay out call back url!!"
        return data_status

@testing_apis.route("/test_accurepay_payin_call_back_url", methods=["POST"])
def test_accurepay_payin_call_back_url():
    print("(((((((((Testing)))))))))")
    data_status = {"responseStatus": 0, "result": ""}
    transaction_id = request.form.get("transaction_id","")
    payment_method = request.form.get("payment_mode","")
    payment_datetime = request.form.get("payment_datetime","")
    payment_channel = request.form.get("payment_channel","")
    bank_ref_id = request.form.get("bank_ref_id","")
    customer_vpa = request.form.get("customer_vpa","")
    response_code = request.form.get("response_code","")
    response_message = request.form.get("response_message","")
    error_desc = request.form.get("error_desc","")
    order_id = request.form.get("order_id","")
    amount = request.form.get("amount","")
    currency = request.form.get("currency","")
    description = request.form.get("description","")
    name = request.form.get("name","")
    email = request.form.get("email","")
    phone = request.form.get("phone","")
    address_line_1 = request.form.get("address_line_1","")
    address_line_2 = request.form.get("address_line_2","")
    city = request.form.get("city","")
    state = request.form.get("state","")
    country = request.form.get("country","")
    zip_code = request.form.get("zip_code","")
    udf1 = request.form.get("udf1","") # userId
    udf2 = request.form.get("udf2","") # payment_link or button_link or payment_page
    udf3 = request.form.get("udf3","") # type of link
    udf4 = request.form.get("udf4","")
    udf5 = request.form.get("udf5","")
    hashValue = request.form.get("hash","")
    location = request.form.get("location","")
    agent = request.form.get("agent","")
    cardmasked = request.form.get("cardmasked","")

    print(request.form)
    print("(((((((((((((((((Pay In Call Back Response Data)))))))))))))))))")
    try:
        if order_id:
            paymentLinkId = None
            PaymentButtonId = None
            paymentPageId = None
            merchantId,user_order_id=order_id.split('-')
            order_queryset = WalletTransactions.objects(pgOrderId=order_id).first()

            user_queryset = Users.objects(id=udf1).first()
            if not user_queryset:
                data_status["result"]="Invalid merchant id!!"
                return data_status

            accure_pay_queryset = TransactionAPI.objects(code="AccurePay_PayIn").first()
            accurePayPaymentGateWayId = str(accure_pay_queryset.id)

            if udf3 == "link":
                payment_link_queryset = PaymentLinks.objects(paymentLink=udf2).first()
                if payment_link_queryset:
                    paymentLinkId=str(payment_link_queryset.id)
                    linkAmount = payment_link_queryset.amount

            elif udf3 == "button":
                button_queryset = PaymentButtons.objects(buttonLink=udf2).first()
                if button_queryset:
                    PaymentButtonId=str(button_queryset.id)
                    linkAmount = button_queryset.amount
            elif udf3 == "page":
                page_queryset = Users.objects(merchantPaymentLink=udf2).first()
                if page_queryset:
                    paymentPageId=str(page_queryset.id)
                    linkAmount = amount

            transactionData = [
                {
                "transaction_id":transaction_id,
                "payment_method":payment_method,
                "payment_datetime":payment_datetime,
                "response_code":response_code,
                "response_message":response_message,
                "order_id":order_id,
                "amount":round(float(amount),2),
                "currency":currency,
                "description":description,
                "name":name,
                "email":email,
                "phone":phone,
                "address_line_1":address_line_1,
                "address_line_2":address_line_2,
                "city":city,
                "state":state,
                "country":country,
                "zip_code":zip_code,
                "udf1":udf1,
                "udf2":udf2,
                "udf3":udf3,
                "udf4":udf4,
                "udf5":udf5,
                "hash":hashValue,
                }
                ]

            print(transactionData)
            print("((((((((((((((((((((((((Pay In Call Back Response transactionData))))))))))))))))))))))))")
            if order_queryset:
                if response_code == "0":
                    order_queryset.update(status=1,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now())
                # elif response_code == "failure":
                #     order_queryset.update(status=0,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now())
                else:
                    order_queryset.update(status=0,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now())
            else:
                ###################### Slab Calculation for Payin ###############################
                payment_mode_queryset = PaymentMode.objects(paymentMode="UPI").first()
                paymentModeId = str(payment_mode_queryset.id)
                sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType="UPI").first()
                subPaymentModeId = str(sub_payment_mode_queryset.id)
                patternId = str(user_queryset.patternId.id)

                print(paymentModeId)
                print(subPaymentModeId)
                print(patternId)
                print("(((((((((((((SLAB DATA)))))))))))))")

                transactionAmount = float(amount)
                grandTotal = 0
                startAmount = 0
                endAmount = 0
                chargeType = ""
                chargeValue = 0
                chargeAmount = 0
                gstAmount = 0
                tdsAmount = 0
                gstInclude = ""
                tdsInclude = ""
                priceType = ""
                aggregatorType = ""
                aggregatorValue = 0
                aggregatorAmount = 0
                commissionType = ""
                commissionValue = 0
                commissionAmount = 0

                slab_queryset = SetupChargeCommissions.objects(
                    transactionAPIId=accurePayPaymentGateWayId,paymentModeId=paymentModeId,subPaymentModeId=subPaymentModeId,patternId=patternId).first()
                if slab_queryset:
                    priceType = slab_queryset.priceType
                    gstInclude = slab_queryset.gstInclude
                    tdsInclude = slab_queryset.tdsInclude
                    gstValue = float(slab_queryset.gstValue)
                    tdsValue = float(slab_queryset.tdsValue)

                    if priceType == "RANGE":
                        priceRangeList = slab_queryset.priceRangeList
                        for each_record in priceRangeList:
                            startAmount = float(each_record.get("startAmount"))
                            endAmount = float(each_record.get("endAmount"))
                            
                            if (float(startAmount) <= float(amount)) and (float(amount) <= float(endAmount)):
                                chargeType = each_record.get("chargeType")
                                chargeValue = float(each_record.get("chargeValue"))
                                aggregatorType = each_record.get("aggregatorType")
                                aggregatorValue = float(each_record.get("aggregatorValue"))
                                commissionType = each_record.get("commissionType")
                                commissionValue = float(each_record.get("commissionValue"))

                    else:
                        chargeType = slab_queryset.chargeType
                        chargeValue = float(slab_queryset.chargeValue)
                        aggregatorType = slab_queryset.aggregatorType
                        aggregatorValue = float(slab_queryset.aggregatorValue)
                        commissionType = slab_queryset.commissionType
                        commissionValue = float(slab_queryset.commissionValue)


                    if chargeValue > 0:
                        if aggregatorType=="FLAT":
                            aggregatorAmount=float(aggregatorValue)
                        else:
                            aggregatorAmount=(float(aggregatorValue)*float(amount))/100

                        if commissionType=="FLAT":
                            commissionAmount=float(commissionValue)
                        else:
                            commissionAmount=(float(commissionValue)*float(amount))/100

                        if chargeType=="FLAT":
                            chargeAmount=chargeValue
                        else:
                            chargeAmount = (float(amount)*float(chargeValue))/100

                        transactionAmount=float(transactionAmount) - float(chargeAmount)

                        if gstValue>0:   
                            gstAmount = (float(chargeAmount)*float(gstValue))/100

                        if tdsValue>0:
                            tdsAmount = (float(chargeAmount)*float(tdsValue))/100
                            
                        if gstInclude == "Yes":
                            chargeAmount = float(chargeAmount)-float(gstAmount)
                        else:
                            transactionAmount = float(transactionAmount)-float(gstAmount)

                        if tdsInclude == "Yes":
                            chargeAmount = float(chargeAmount)-float(tdsAmount)
                        else:
                            transactionAmount = float(transactionAmount)-float(tdsAmount)

                commissionCharges = {}
                commissionCharges = {
                "aggregatorType":aggregatorType,
                "aggregatorAmount":round(float(aggregatorAmount),2),
                "commissionType":commissionType,
                "commissionAmount":round(float(commissionAmount),2),
                "chargeType":chargeType,
                "chargeAmount":round(float(chargeAmount),2),
                "transactionAmount":round(float(transactionAmount),2),
                "gstInclude":gstInclude,
                "gstAmount":round(float(gstAmount),2),
                "tdsInclude":tdsInclude,
                "tdsAmount":round(float(tdsAmount),2),
                "priceType":priceType,
                }

                if slab_queryset:
                    slabId = str(slab_queryset.id)
                else:
                    slabId = None
                payin_balance_queryset = PayinBalances.objects(userId=str(user_queryset.id),transactionAPIId=str(accurePayPaymentGateWayId)).first()
                if response_code == "0":
                    actuallBalance = user_queryset.walletBalance
                    updateAmount = float(actuallBalance)+float(transactionAmount)

                    if float(amount) >= float(linkAmount):
                        status = 1
                        errorMessage = error_desc
                    else:
                        status = 0
                        errorMessage = "Insufficient amount credited!!"

                    wallet_transaction_table = WalletTransactions(
                        userId = udf1,
                        amount = round(float(amount),2),
                        grandTotal=round(float(transactionAmount),2),
                        paymentGatewayId = accurePayPaymentGateWayId,
                        paymentType = payment_method,
                        creditType = "Credit",
                        transactionId = transaction_id,
                        transactionData = transactionData,
                        orderId = user_order_id,
                        walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",
                        userType="user",
                        createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = location,
                        platform = udf3,
                        agent = agent,
                        slabId=slabId,
                        customerEmail = email,
                        customerName = name,
                        customerPhonenumber = phone,
                        previousBalance=round(float(actuallBalance),2),
                        currentBalance=round(float(updateAmount),2),
                        paymentLinkId = paymentLinkId,
                        PaymentButtonId = PaymentButtonId,
                        paymentPageId = paymentPageId,
                        errorMessage = errorMessage,
                        paymentChannel = payment_channel,
                        bankRefId=bank_ref_id,
                        cardmasked=cardmasked,
                        pgOrderId=order_id,
                        customerVpa=customer_vpa,
                        commissionCharges=commissionCharges,
                        status = status
                        ).save()
                    walletTransactionId = str(wallet_transaction_table.id)
                    user_queryset.update(walletBalance = round(float(updateAmount),2))
                    if payin_balance_queryset:
                        previousBalance=payin_balance_queryset.currentBalance
                        currentBalance=float(previousBalance)+float(transactionAmount)
                        payin_balance_queryset.update(previousBalance = round(float(previousBalance),2),currentBalance=round(float(currentBalance),2),updatedOn=datetime.datetime.now())
                    else:
                        payin_balance_save=PayinBalances(
                            transactionAPIId=str(accurePayPaymentGateWayId),
                            userId = str(user_queryset.id),
                            previousBalance=0,
                            currentBalance=round(float(transactionAmount),2),
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                
                else:
                    actuallBalance = user_queryset.walletBalance
                    wallet_transaction_table = WalletTransactions(
                        slabId = slabId,
                        userId = udf1,
                        amount = round(float(amount),2),
                        grandTotal=round(float(transactionAmount),2),
                        paymentGatewayId = accurePayPaymentGateWayId,
                        paymentType = payment_method,
                        creditType = "Credit",
                        transactionId = transaction_id,
                        transactionData = transactionData,
                        orderId = user_order_id,
                        walletLog="Unable to add money.Transaction Failed!!",
                        userType="user",
                        createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = location,
                        platform = udf3,
                        agent = agent,
                        customerEmail = email,
                        customerPhonenumber = phone,
                        customerName = name,
                        previousBalance=round(float(actuallBalance),2),
                        currentBalance=round(float(actuallBalance),2),
                        paymentLinkId = paymentLinkId,
                        PaymentButtonId = PaymentButtonId,
                        paymentPageId = paymentPageId,
                        errorMessage = error_desc,
                        paymentChannel = payment_channel,
                        bankRefId=bank_ref_id,
                        cardmasked=cardmasked,
                        customerVpa=customer_vpa,
                        commissionCharges=commissionCharges,
                        pgOrderId=order_id,
                        status = 0
                        ).save()
                    walletTransactionId = str(wallet_transaction_table.id)
                    if payin_balance_queryset:
                        previousBalance=payin_balance_queryset.currentBalance
                        payin_balance_queryset.update(previousBalance = round(float(previousBalance),2),currentBalance=round(float(previousBalance),2),updatedOn=datetime.datetime.now())
                    else:
                        payin_balance_save=PayinBalances(
                            transactionAPIId=str(accurePayPaymentGateWayId),
                            userId = str(user_queryset.id),
                            previousBalance=0,
                            currentBalance=0,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                if udf3 == "link":
                    if payment_link_queryset:
                        payment_link_queryset.update(status=3)
                elif udf3 == "button":
                    if button_queryset:
                        button_queryset.update(status=3)
            data_status["responseStatus"] = 1
            data_status["result"] = "Pay In call back url was successful!"
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to pay in call back url!!"
        return data_status


@testing_apis.route("/testing_wowpe_payin_call_back_url", methods=["POST"])
def testing_wowpe_payin_call_back_url():
    data_status = {"responseStatus": 0, "result": ""}
    pgOrderId = request.json.get("OrderId","")
    payment_method = request.json.get("PaymentMode","")
    payment_datetime = request.json.get("Date","")
    bank_ref_id = request.json.get("BankRRN","")
    customer_vpa = request.json.get("PayerVPA","")
    apiMerchantId = request.json.get("MerchantId","")
    response_code = request.json.get("Status","")
    order_id = request.json.get("ClientOrderId","")
    amount = request.json.get("Amount","")
    OrderAmount = request.json.get("OrderAmount","")
    currency = request.json.get("Currency","")
    name = request.json.get("PayerName","")
    phone = request.json.get("PayerMobile","")
    transaction_id = request.json.get("RefNumber","")
    Checksum = request.json.get("Checksum","")

    print(request.json)
    print("(((((((((((((((((Wowpe Call Back Response Data)))))))))))))))))")

    requestData = [request.json]

    save_api_webhook_logs_table = save_webhook_logs_data(None,"payin","call_back","wowpe_payin_call_back_url",None,requestData,"api","")

    try:
        if order_id:
            linkAmount=0
            merchantId,user_order_id=order_id.split('-')
            order_queryset = WalletTransactions.objects(pgOrderId=pgOrderId).first()
            if not order_queryset:
                data_status["result"]="Invalid Order id!!"
                return data_status
            user_queryset = Users.objects(merchantUniqueNumber=merchantId).first()
            if not user_queryset:
                data_status["result"]="Invalid merchant id!!"
                return data_status

            paymentGateWayId = str(order_queryset.paymentGatewayId.id)
            userId = str(user_queryset.id)

            save_api_webhook_logs_table.update(userId=ObjectId(userId),transactionAPIId=ObjectId(paymentGateWayId),orderId=user_order_id)

            if order_queryset.platform == "link":
                payment_link_queryset = PaymentLinks.objects(id=str(order_queryset.paymentLinkId.id)).first()
                if payment_link_queryset:
                    paymentLinkId=str(payment_link_queryset.id)
                    linkAmount = payment_link_queryset.amount

            elif order_queryset.platform == "button":
                button_queryset = PaymentButtons.objects(id=str(order_queryset.PaymentButtonId.id)).first()
                if button_queryset:
                    PaymentButtonId=str(button_queryset.id)
                    linkAmount = button_queryset.amount
            elif order_queryset.platform == "page":
                page_queryset = Users.objects(id=str(order_queryset.paymentPageId.id)).first()
                if page_queryset:
                    paymentPageId=str(page_queryset.id)
                linkAmount = float(order_queryset.amount)
            else:
                linkAmount = float(order_queryset.amount)

            print(linkAmount,"(((((((((linkAmount)))))))))")
            transactionData = [
                request.json
                ]

            ###################### Slab Calculation for Payin ###############################
            payment_mode_queryset = PaymentMode.objects(paymentMode="UPI").first()
            paymentModeId = str(payment_mode_queryset.id)
            sub_payment_mode_queryset = SubPaymentModes.objects(paymentModeId=paymentModeId,subPaymentModeType="UPI").first()
            subPaymentModeId = str(sub_payment_mode_queryset.id)
            patternId = str(user_queryset.patternId.id)

            transactionAmount = float(linkAmount)
            grandTotal = 0
            startAmount = 0
            endAmount = 0
            chargeType = ""
            chargeValue = 0
            chargeAmount = 0
            gstAmount = 0
            tdsAmount = 0
            gstInclude = ""
            tdsInclude = ""
            priceType = ""
            aggregatorType = ""
            aggregatorValue = 0
            aggregatorAmount = 0
            commissionType = ""
            commissionValue = 0
            commissionAmount = 0
            actuallBalance = 0
            previousBalance = 0
            updateAmount = 0
            currentBalance = 0

            slab_queryset = SetupChargeCommissions.objects(
                transactionAPIId=paymentGateWayId,paymentModeId=paymentModeId,subPaymentModeId=subPaymentModeId,patternId=patternId).first()
            if slab_queryset:
                priceType = slab_queryset.priceType
                gstInclude = slab_queryset.gstInclude
                tdsInclude = slab_queryset.tdsInclude
                gstValue = float(slab_queryset.gstValue)
                tdsValue = float(slab_queryset.tdsValue)

                if priceType == "RANGE":
                    priceRangeList = slab_queryset.priceRangeList
                    for each_record in priceRangeList:
                        startAmount = float(each_record.get("startAmount"))
                        endAmount = float(each_record.get("endAmount"))
                        
                        if (float(startAmount) <= float(amount)) and (float(amount) <= float(endAmount)):
                            chargeType = each_record.get("chargeType")
                            chargeValue = float(each_record.get("chargeValue"))
                            aggregatorType = each_record.get("aggregatorType")
                            aggregatorValue = float(each_record.get("aggregatorValue"))
                            commissionType = each_record.get("commissionType")
                            commissionValue = float(each_record.get("commissionValue"))

                else:
                    chargeType = slab_queryset.chargeType
                    chargeValue = float(slab_queryset.chargeValue)
                    aggregatorType = slab_queryset.aggregatorType
                    aggregatorValue = float(slab_queryset.aggregatorValue)
                    commissionType = slab_queryset.commissionType
                    commissionValue = float(slab_queryset.commissionValue)


                if chargeValue > 0:
                    if aggregatorType=="FLAT":
                        aggregatorAmount=float(aggregatorValue)
                    else:
                        aggregatorAmount=(float(aggregatorValue)*float(amount))/100

                    if commissionType=="FLAT":
                        commissionAmount=float(commissionValue)
                    else:
                        commissionAmount=(float(commissionValue)*float(amount))/100

                    if chargeType=="FLAT":
                        chargeAmount=chargeValue
                    else:
                        chargeAmount = (float(amount)*float(chargeValue))/100

                    transactionAmount=float(transactionAmount) - float(chargeAmount)

                    if gstValue>0:   
                        gstAmount = (float(chargeAmount)*float(gstValue))/100

                    if tdsValue>0:
                        tdsAmount = (float(chargeAmount)*float(tdsValue))/100
                        
                    if gstInclude == "Yes":
                        chargeAmount = float(chargeAmount)-float(gstAmount)
                    else:
                        transactionAmount = float(transactionAmount)-float(gstAmount)

                    if tdsInclude == "Yes":
                        chargeAmount = float(chargeAmount)-float(tdsAmount)
                    else:
                        transactionAmount = float(transactionAmount)-float(tdsAmount)

            commissionCharges = {}
            commissionCharges = {
            "aggregatorType":aggregatorType,
            "aggregatorAmount":round(float(aggregatorAmount),2),
            "commissionType":commissionType,
            "commissionAmount":round(float(commissionAmount),2),
            "chargeType":chargeType,
            "chargeAmount":round(float(chargeAmount),2),
            "transactionAmount":round(float(transactionAmount),2),
            "gstInclude":gstInclude,
            "gstAmount":round(float(gstAmount),2),
            "tdsInclude":tdsInclude,
            "tdsAmount":round(float(tdsAmount),2),
            "priceType":priceType,
            }
            errorMessage=""
            if slab_queryset:
                slabId = str(slab_queryset.id)
                order_queryset.update(slabId = ObjectId(slabId))
            else:
                slabId = None
                order_queryset.update(slabId = slabId)
            payin_balance_queryset = PayinBalances.objects(userId=str(user_queryset.id),transactionAPIId=str(paymentGateWayId)).first()
            if response_code == 1:
                if float(amount) >= float(linkAmount):
                    status = 1
                    errorMessage = "Success"
                else:
                    status = 0
                    errorMessage = "Insufficient amount credited!!"
                lorder_queryset = WalletTransactions.objects(pgOrderId=pgOrderId).first()
                if lorder_queryset.status!=1 and status==1:
                    latest_user_queryset = Users.objects(id=str(user_queryset.id)).first()
                    actuallBalance = latest_user_queryset.walletBalance
                    updateAmount = float(actuallBalance)+float(transactionAmount)
                    latest_user_queryset.update(walletBalance = round(float(updateAmount),2))
                    latest_payin_balance_queryset = PayinBalances.objects(userId=str(user_queryset.id),transactionAPIId=str(paymentGateWayId)).first()
                    if latest_payin_balance_queryset:
                        previousBalance=latest_payin_balance_queryset.currentBalance
                        currentBalance=float(previousBalance)+float(transactionAmount)
                        latest_payin_balance_queryset.update(previousBalance = round(float(previousBalance),2),currentBalance=round(float(currentBalance),2),updatedOn=datetime.datetime.now())
                        payinbalancelogs_queryset=PayinBalanceLogs(
                            transactionAPIId=str(paymentGateWayId),
                            userId=str(user_queryset.id),
                            previousBalance=previousBalance,
                            currentBalance=currentBalance,
                            orderId=order_queryset.orderId,
                            amount=round(float(amount),2),
                            grandTotal=round(float(transactionAmount),2),
                            transferType="Credit",
                            userType="user",
                            transactionId=transaction_id,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                    else:
                        payin_balance_save=PayinBalances(
                            transactionAPIId=str(paymentGateWayId),
                            userId = str(user_queryset.id),
                            previousBalance=0,
                            currentBalance=round(float(transactionAmount),2),
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                        payinbalancelogs_queryset=PayinBalanceLogs(
                            transactionAPIId=str(paymentGateWayId),
                            userId=str(user_queryset.id),
                            previousBalance=0,
                            currentBalance=round(float(transactionAmount),2),
                            orderId=order_queryset.orderId,
                            amount=round(float(amount),2),
                            grandTotal=round(float(transactionAmount),2),
                            transferType="Credit",
                            userType="user",
                            transactionId=transaction_id,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                    lorder_queryset.update(status=status,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now(),transactionId=transaction_id,bankRefId=bank_ref_id,customerVpa=customer_vpa,currency=currency,errorMessage=errorMessage,grandTotal=round(float(transactionAmount),2),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",previousBalance=round(float(actuallBalance),2),currentBalance=round(float(updateAmount),2),commissionCharges=commissionCharges)
                else:
                    order_queryset.update(status=status,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now(),transactionId=transaction_id,bankRefId=bank_ref_id,customerVpa=customer_vpa,currency=currency,errorMessage=errorMessage,grandTotal=round(float(transactionAmount),2),walletLog="Wallet Balance is added with the amount of " + str(amount) + ".",commissionCharges=commissionCharges)
            else:
                transactionstatus=3
                status=2
                errorMessage="Pending"
                if response_code==0:
                    transactionstatus=0
                    status=0
                    errorMessage="Failed"
                elif response_code==4:
                    transactionstatus=4
                    status=4
                    errorMessage="Reversal"
                else:
                    status=2
                    transactionstatus=3
                    errorMessage="Pending"

                lorder_queryset = WalletTransactions.objects(pgOrderId=pgOrderId).first()
                if lorder_queryset.status==1:
                    latest_user_queryset = Users.objects(id=str(user_queryset.id)).first()
                    actuallBalance = latest_user_queryset.walletBalance
                    updateAmount = float(actuallBalance)-float(lorder_queryset.grandTotal)
                    latest_user_queryset.update(walletBalance = round(float(updateAmount),2))
                    latest_payin_balance_queryset = PayinBalances.objects(userId=str(user_queryset.id),transactionAPIId=str(paymentGateWayId)).first()
                    if latest_payin_balance_queryset:
                        previousBalance=latest_payin_balance_queryset.currentBalance
                        currentBalance=float(previousBalance)-float(lorder_queryset.grandTotal)
                        latest_payin_balance_queryset.update(previousBalance = round(float(previousBalance),2),currentBalance=round(float(currentBalance),2),updatedOn=datetime.datetime.now())
                        payinbalancelogs_queryset=PayinBalanceLogs(
                            transactionAPIId=str(paymentGateWayId),
                            userId=str(user_queryset.id),
                            previousBalance=previousBalance,
                            currentBalance=currentBalance,
                            orderId=lorder_queryset.orderId,
                            amount=round(float(amount),2),
                            grandTotal=round(float(transactionAmount),2),
                            transferType="Debit",
                            userType="user",
                            transactionId=transaction_id,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                    else:
                        payin_balance_save=PayinBalances(
                            transactionAPIId=str(paymentGateWayId),
                            userId = str(user_queryset.id),
                            previousBalance=0,
                            currentBalance=0,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()

                        payinbalancelogs_queryset=PayinBalanceLogs(
                            transactionAPIId=str(paymentGateWayId),
                            userId=str(user_queryset.id),
                            previousBalance=0,
                            currentBalance=0,
                            orderId=order_queryset.orderId,
                            amount=round(float(amount),2),
                            grandTotal=round(float(transactionAmount),2),
                            transferType="Debit",
                            userType="user",
                            transactionId=transaction_id,
                            createdOn=datetime.datetime.now(),
                            status=1
                            ).save()
                    rorderId = random_digit_generate(16)
                    wallet_transaction_table = WalletTransactions(
                        userId = str(user_queryset.id),
                        amount = round(float(order_queryset.amount),2),
                        grandTotal=round(float(transactionAmount),2),
                        paymentGatewayId = str(paymentGateWayId),
                        currency=order_queryset.currency,
                        paymentType = order_queryset.paymentType,
                        creditType = "Debit",
                        transactionId = transaction_id,
                        transactionData = transactionData,
                        orderId = str(rorderId),
                        walletLog="Wallet Balance is refunded with the amount of " + str(order_queryset.amount) + ".",
                        userType="user",
                        createdBy = None,
                        createdOn = datetime.datetime.now(),
                        location = "",
                        platform = "api",
                        agent = "",
                        customerEmail = order_queryset.customerEmail,
                        customerName = order_queryset.customerName,
                        customerPhonenumber = order_queryset.customerPhonenumber,
                        previousBalance=round(float(actuallBalance),2),
                        currentBalance=round(float(updateAmount),2),
                        paymentLinkId = None,
                        PaymentButtonId = None,
                        paymentPageId = None,
                        errorMessage = "Refunded",
                        paymentChannel = "Wowpe",
                        bankRefId=order_queryset.bankRefId,
                        cardmasked="",
                        pgOrderId=order_queryset.orderId,
                        customerVpa="",
                        commissionCharges=commissionCharges,
                        status = 5
                        ).save()
                    order_queryset.update(status=transactionstatus,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now(),transactionId=transaction_id,bankRefId=bank_ref_id,customerVpa=customer_vpa,currency=currency,errorMessage=errorMessage,grandTotal=round(float(transactionAmount),2),commissionCharges=commissionCharges)
                else:
                    order_queryset.update(status=transactionstatus,payInResponseCallBackData=transactionData,responseCallBackTime=datetime.datetime.now(),transactionId=transaction_id,bankRefId=bank_ref_id,customerVpa=customer_vpa,currency=currency,errorMessage=errorMessage,grandTotal=round(float(transactionAmount),2),commissionCharges=commissionCharges)

            if order_queryset.platform == "link":
                if payment_link_queryset:
                    payment_link_queryset.update(status=3)
            elif order_queryset.platform == "button":
                if button_queryset:
                    button_queryset.update(status=3)
            data_status["responseStatus"] = 1
            data_status["result"] = "Pay In call back url was successful!"
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        print("GETTING ERROR")
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to pay in call back url!!"
        return data_status

################################## WOWPE Payout Call Back URL API ######################################
@testing_apis.route("/test_wowpe_payout_call_back_url",methods=["POST"])
def test_wowpe_payout_call_back_url():
    print("(((((((((test_wowpe_payout_call_back_url)))))))))")
    data_status = {"responseStatus":0,"result":""}
    StatusCode = request.json.get("StatusCode")
    Message = request.json.get("Message","")
    OrderId = request.json.get("OrderId","")
    Status = request.json.get("Status")
    ClientOrderId = request.json.get("ClientOrderId","")
    PaymentMode = request.json.get("PaymentMode","")
    transaction_amount = request.json.get("Amount","")
    Date = request.json.get("Date","")
    UTR = request.json.get("UTR","")
    Checksum = request.json.get("Checksum","")
    print(request.json,"wowpe payout response result")

    requestData = [request.json]

    save_api_webhook_logs_table = save_webhook_logs_data(None,"payout","call_back","wowpe_payout_call_back_url",None,requestData,"api","")

    try:
        StatusText="FAILED"
        fund_transfer_queryset = FundTransfers.objects(pgOrderId=ClientOrderId,status__nin=[5]).first()
        if not fund_transfer_queryset:
            data_status["result"]="Invalid order id!!"
            return data_status

        fundTransferUserId = str(fund_transfer_queryset.userId.id)
        transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)
        fundTransferOrderId=str(fund_transfer_queryset.merchantReferenceNumber)

        save_api_webhook_logs_table.update(userId=ObjectId(fundTransferUserId),transactionAPIId=ObjectId(transactionAPIId),orderId=fundTransferOrderId)


        responseDict = {
            "StatusCode": StatusCode,
            "Message": Message,
            "OrderId": OrderId,
            "Status": Status,
            "ClientOrderId": ClientOrderId,
            "PaymentMode": PaymentMode,
            "Amount": transaction_amount,
            "Date": Date,
            "UTR": UTR,
            "Checksum": Checksum,
            }
        key = "1234567890123456"
        #checkSumData = generate_checksum(responseDict, key)
        payoutResponseCallBackData = []
        payoutResponseCallBackData = [responseDict]
        if OrderId:
            transactionUniqueId=OrderId
        else:
            transactionUniqueId=fund_transfer_queryset.transactionUniqueId

        fund_transfer_queryset.update(transactionUniqueId=transactionUniqueId)
        if StatusCode!=1:
            data_status["responseStatus"] = 1
            data_status["result"] = "Wowpe payout call back url was successful!"
            return data_status
        else:
            transactionstatus=2
            if Status==1:
                transactionstatus=1
                StatusText="SUCCESS"
            elif Status == 0:
                transactionstatus=0
                StatusText="FAILED"
            elif Status == 4:
                transactionstatus=4
                StatusText="REVERSAL"
            else:
                transactionstatus=2
                StatusText="PROCESSING"

            prev_fund_transfer_queryset = FundTransfers.objects(pgOrderId=ClientOrderId,status__nin=[5]).first()
            previousstatus=prev_fund_transfer_queryset.status
            if transactionstatus==0 or transactionstatus==4:
                getrefund_record=FundTransfers.objects(transactionUniqueId=prev_fund_transfer_queryset.merchantReferenceNumber).count()
                print(getrefund_record,"((((((((((getrefund_record))))))))))))")
                if (previousstatus==1 or previousstatus==2) and getrefund_record==0:
                    userquery_set=Users.objects(id=str(fund_transfer_queryset.userId.id)).first()
                    userpreviousbalance=userquery_set.payoutBalance
                    usercurrentbalance=round(float(userpreviousbalance),2)+round(float(fund_transfer_queryset.grandTotal))
                    userquery_set.update(payoutBalance=round(float(usercurrentbalance)))
                    updatepayout_balance_queryset = PayoutBalances.objects(userId=str(fund_transfer_queryset.userId.id),transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id)).first()
                    refundpreviousBalance=updatepayout_balance_queryset.currentBalance
                    refundpayoutCurrentBalance=float(refundpreviousBalance)+float(fund_transfer_queryset.grandTotal)
                    updatepayout_balance_queryset.update(previousBalance=round(float(refundpreviousBalance),2),currentBalance=round(float(refundpayoutCurrentBalance),2),updatedOn=datetime.datetime.now())
                    merchantReferenceNumber=random_digit_generate(16)
                    refund_transfer_table = FundTransfers(
                        userId=str(userquery_set.id),
                        transactionAPIId=str(fund_transfer_queryset.transactionAPIId.id),
                        bankId=None,
                        bankName=str(fund_transfer_queryset.bankName),
                        merchantReferenceNumber=merchantReferenceNumber,
                        transactionUniqueId=str(fund_transfer_queryset.merchantReferenceNumber),
                        pgOrderId=str(fund_transfer_queryset.pgOrderId),
                        fundTransferType="instant",
                        accountType="bank",
                        apiType="api",
                        slabId=str(fund_transfer_queryset.slabId),
                        transferType="Refund",
                        transactionData=requestData,
                        bankBranch=str(fund_transfer_queryset.bankBranch),
                        accountNumber=str(fund_transfer_queryset.accountNumber),
                        accountIFSCCode=str(fund_transfer_queryset.accountIFSCCode),
                        beneficiaryName=str(fund_transfer_queryset.beneficiaryName),
                        uniqueRequestNumber=None,
                        amount=str(fund_transfer_queryset.amount),
                        grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                        previousBalance = round(float(userpreviousbalance),2),
                        currentBalance = round(float(usercurrentbalance),2),
                        beneficiaryMail=str(fund_transfer_queryset.beneficiaryMail),
                        beneficiaryPhone=str(fund_transfer_queryset.beneficiaryPhone),
                        paymentMode=str(fund_transfer_queryset.paymentMode),
                        narration=str(fund_transfer_queryset.narration),
                        createdOn=datetime.datetime.now(),
                        userType="user",
                        status=5
                        )
                    save_table = refund_transfer_table.save()
                    payoutbalancelog_queryset=PayoutBalanceLogs(
                        userId =str(userquery_set.id),
                        transactionAPIId =str(fund_transfer_queryset.transactionAPIId.id),
                        previousBalance = round(float(refundpreviousBalance),2),
                        currentBalance = round(float(refundpayoutCurrentBalance),2),
                        amount=round(float(fund_transfer_queryset.amount),2),
                        grandTotal=round(float(fund_transfer_queryset.grandTotal),2),
                        orderId=merchantReferenceNumber,
                        transferType = "Refund",
                        userType = "user",
                        transactionId = str(fund_transfer_queryset.merchantReferenceNumber),
                        createdOn = datetime.datetime.now(),
                        status = 1
                        ).save()

            fund_transfer_queryset.update(
                payoutResponseCallBackData=payoutResponseCallBackData,
                responseCallBackTime=datetime.datetime.now(),
                bankReferenceNumber=UTR,
                errorMessage=Message,
                status=transactionstatus
                )
        data_status["responseStatus"] = 1
        data_status["result"] = "Wowpe payout call back url was successful!"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to get wowpe payout call back url data!!"
        return data_status