from appservices.common.util import *


###################################################### Wowpe Payout API's #########################################################################
def wowpe_payout_fundtransfer(get_client,get_secret,get_base_url,number,amount,transferMode,accountNo,ifscCode,beneficiaryName,clientOrderId,userId,payOutPaymentGatewayId,client_ip,apiType):
    wowpeResponseData = {}
    paymentgatewayresponseDict = {}
    try:
        wowpe_request_body = {
          "clientId": get_client,
          "secretKey": get_secret,
          "number": number,
          "amount": amount,
          "transferMode": transferMode,
          "accountNo": accountNo,
          "ifscCode": ifscCode,
          "beneficiaryName": beneficiaryName,
          "vpa": "",
          "clientOrderId": clientOrderId
        }
        print(wowpe_request_body,"WOWPE REQUEST BODY")
        headers = {
            "accept": "application/json",
            "content-type": "application/json"
        }
        url = get_base_url+"/payout"
        # API Logs Table Saving Here
        requestData=[wowpe_request_body]
        save_wowpe_link_api_log_table = save_api_logs_data(userId,"payout","fund_transfer",url,payOutPaymentGatewayId,requestData,client_ip,apiType)

        try:
            response = requests.post(url,json=wowpe_request_body, headers=headers)
            wowpeResponseData = json.loads(response.text)
            print(response.text,"(((((((((((((WOWPE PAYOUT RESPONSE)))))))))))))")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            paymentgatewayresponseDict["responseStatus"]=0
            paymentgatewayresponseDict['result']="Our banking partner server is down please try after sometime!!"
            return paymentgatewayresponseDict
        
        # Update API Logs DATA Here
        save_wowpe_link_api_log_table.update(responseData=[wowpeResponseData],responseDate=datetime.datetime.now())
        transactionData = [wowpeResponseData]

        if wowpeResponseData:
            transactionstatus=2
            bank_reference_number=''
            transaction_id=''
            messages=""
            status="PROCESSING"
            if wowpeResponseData.get('status')==400:
                transactionstatus=0
                errordct=wowpeResponseData.get('errors')
                traceId=wowpeResponseData.get('traceId')
                transaction_id=traceId
                messageslist=[]
                messages=","
                for i in errordct:
                    for j in errordct[i]:
                        messageslist.append(j)

                messages=','.join([str(elem) for elem in messageslist])
                print(messages)
            else:
                if wowpeResponseData.get("statusCode")==0:
                    transactionstatus=0
                    status="FAILED"
                elif wowpeResponseData.get("statusCode") == 1 and wowpeResponseData.get("status") == 1:
                    transactionstatus=1
                    status="SUCCESS"
                elif wowpeResponseData.get("statusCode") == 1 and wowpeResponseData.get("status") == 0:
                    transactionstatus=0
                    status="FAILED"
                elif wowpeResponseData.get("statusCode") == 1 and wowpeResponseData.get("status") == 4:
                    transactionstatus=4
                    status="REVERSAL"
                else:
                    transactionstatus=2
                    status="PROCESSING"

                messages=wowpeResponseData.get('message')
                transaction_id=wowpeResponseData.get('orderId')
                bank_reference_number=wowpeResponseData.get('utr')

            paymentgatewayresponseDict={
            "responseStatus":1,
            'transactionstatus':transactionstatus,
            'status':status,
            "messages":messages,
            "bank_reference_number":bank_reference_number,
            "transaction_id":transaction_id,
            "transactionData":transactionData,
            }
            return paymentgatewayresponseDict
        else:
            paymentgatewayresponseDict["responseStatus"]=0
            paymentgatewayresponseDict['result']="Our banking partner server is down please try after sometime!!"
            return paymentgatewayresponseDict
    except Exception as e:
        app.logger.error(traceback.format_exc())
        paymentgatewayresponseDict["responseStatus"]=0
        paymentgatewayresponseDict['result']="Our banking partner server is down please try after sometime!!"
        return paymentgatewayresponseDict



def wowpe_payout_fundtransfer_status(get_api_key,get_secret,get_base_url,pgOrderId,fund_transfer_queryset):
    paymentgatewayResponseStatusDict = {}
    responseBody = {}
    try:
        requestBody = {
        "clientid":get_api_key,
        "secretKey":get_secret,
        "clientOrderId":pgOrderId
        }
        headers = {
            "accept": "application/json",
            "content-type": "application/json"
        }
        url = get_base_url+"/status-check"
        try:
            response = requests.post(url, json=requestBody,headers=headers)
            wowpeResponseData = json.loads(response.text)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            paymentgatewayResponseStatusDict["responseStatus"]=0
            paymentgatewayResponseStatusDict["result"]="Our banking partner server is down please try after sometime!!"
            return paymentgatewayResponseStatusDict
        
        if not wowpeResponseData:
            paymentgatewayResponseStatusDict["responseStatus"]=0
            paymentgatewayResponseStatusDict["result"]="Our banking partner server is down please try after sometime!!"
            return paymentgatewayResponseStatusDict

        transactionData = [wowpeResponseData]
        statusCode=wowpeResponseData.get("statusCode")
        bankReferenceNumber=""
        if wowpeResponseData.get("utr"):
            bankReferenceNumber=wowpeResponseData.get("utr")
        else:
            bankReferenceNumber=fund_transfer_queryset.bankReferenceNumber
        if statusCode==0:
            paymentgatewayResponseStatusDict = {
            "responseStatus":2,
            "result":"No Update!!",
            "transaction_id":wowpeResponseData.get("orderId")
            }
        else:
            orderId=wowpeResponseData.get('orderId')
            if orderId:
                transactionUniqueId=str(orderId)
            else:
                transactionUniqueId=str(fund_transfer_queryset.transactionUniqueId)
                
            transactionStatus=2
            textStatus="PROCESSING"
            if statusCode==6:
                transactionStatus=0
                textStatus="FAILED"
            elif statusCode==1:
                status = wowpeResponseData.get("status")
                if status == 1:
                    transactionStatus=1
                    textStatus="SUCCESS"
                elif status == 0:
                    transactionStatus=0
                    textStatus="FAILED"
                elif status == 4:
                    transactionStatus=4
                    textStatus = "REVERSAL"
                else:
                    transactionStatus=2
                    textStatus="PROCESSING"

            paymentgatewayResponseStatusDict ={
            "responseStatus":1,
            "transactionStatus":transactionStatus,
            "bankReferenceNumber":bankReferenceNumber,
            "textStatus":textStatus,
            "error_message":wowpeResponseData.get("message"),
            "transaction_id":wowpeResponseData.get("orderId"),
            "transactionData":transactionData
            }
    except Exception as e:
        app.logger.error(traceback.format_exc())
        paymentgatewayResponseStatusDict["responseStatus"]=0
        paymentgatewayResponseStatusDict['result']="Our banking partner server is down please try after sometime!!"
    return paymentgatewayResponseStatusDict

##################################################################################################################################################

###################################################### Wowpe Payin API's #########################################################################

def wowpe_payin_payment_intent(get_client,get_secret,get_base_url,name,phone,email,amount,pgOrderId,userId,payinPaymentGatewayId,client_ip,note,apiType):
    wowpeCreateOrderResponseData = {}
    paymentgatewayresponseDict = {}
    try:
        wowpe_request_body = {
        "clientId": get_client,
        "secretKey": get_secret,
        "name": name,
        "mobileNo":phone,
        "emailID":email,
        "amount": amount,
        "clientOrderId": pgOrderId
        }
        print(wowpe_request_body,"WOWPE PAYIN REQUEST BODY")

        # API Logs Table Saving Here
        requestData=[wowpe_request_body]
        url = get_base_url+"/orders"
        save_wowpe_api_log_table = save_api_logs_data(userId,"payin","create_order",url,payinPaymentGatewayId,requestData,client_ip,apiType)
        print(save_wowpe_api_log_table,"save_wowpe_api_log_table")

        headers = {
            "accept": "application/json",
            "content-type": "application/json"
        }
        try:
            response = requests.post(url,json=wowpe_request_body, headers=headers)
            wowpeCreateOrderResponseData = json.loads(response.text)
            print(wowpeCreateOrderResponseData,"(((((((((((((WOWPE PAYIN RESPONSE)))))))))))))")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            paymentgatewayresponseDict["responseStatus"]=0
            paymentgatewayresponseDict['result']="Our banking partner server is down please try after sometime!!"
            return paymentgatewayresponseDict
        
        
        # Update API Logs Table Here
        save_wowpe_api_log_table.update(responseData=[wowpeCreateOrderResponseData],responseDate=datetime.datetime.now())
        print(wowpeCreateOrderResponseData,"RESPONSE FOR PAYIN WOWPE CREATE ORDER DATA")

        if wowpeCreateOrderResponseData.get("statusCode") == 1:
            get_order_id = wowpeCreateOrderResponseData.get("orderId")

            get_deeplink_data = {
            "clientId": get_client,
            "secretKey": get_secret,
            "note":note,
            "orderId":get_order_id
            }
            deeplinkResponseData={}
            deep_link_url = get_base_url+"/intent-initiate"
            wowpeDeeplinkRequestData=[get_deeplink_data]

            # API Logs Table Saving Here
            save_deeplink_api_log_table = save_api_logs_data(userId,"payin","intent",deep_link_url,payinPaymentGatewayId,wowpeDeeplinkRequestData,client_ip,apiType)
            try:
                deep_link_response = requests.post(deep_link_url, json=get_deeplink_data, headers=headers)
                deeplinkResponseData = json.loads(deep_link_response.text)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                paymentgatewayresponseDict["responseStatus"]=0
                paymentgatewayresponseDict['result']="Our banking partner server is down please try after sometime!!"
                return paymentgatewayresponseDict

            print(deeplinkResponseData,"RESPONSE FOR PAYIN WOWPE DEEP LINK DATA")
            
            # For update response data in api log table
            save_deeplink_api_log_table.update(responseData=[deeplinkResponseData],responseDate=datetime.datetime.now())

            transactionData = [deeplinkResponseData]
            pgOrderId = deeplinkResponseData.get("orderId")
            upi_intent_url = deeplinkResponseData.get("upiurl")
            payment_request_id=wowpeCreateOrderResponseData.get("orderId")

            if deeplinkResponseData.get('statusCode')==1:
                if deeplinkResponseData.get("upiurl")!=None:
                    paymentgatewayresponseDict={
                    "responseStatus":1,
                    "pgOrderId":pgOrderId,
                    "upi_intent_url":upi_intent_url,
                    "payment_request_id":payment_request_id,
                    "transactionData":transactionData,
                    "paymentChannel":"Wowpe",
                    "result":"Success"
                    }
                    return paymentgatewayresponseDict
                else:
                    paymentgatewayresponseDict = {"responseStatus":2,"result":"Request failed with status code BadRequest"}
                    return paymentgatewayresponseDict
            else:
                paymentgatewayresponseDict = {"responseStatus":0,"result":deeplinkResponseData.get("message")}
                return paymentgatewayresponseDict
        else:
            paymentgatewayresponseDict = {"responseStatus":0,"result":wowpeCreateOrderResponseData.get("message")}
            return paymentgatewayresponseDict
    except Exception as e:
        app.logger.error(traceback.format_exc())
        paymentgatewayresponseDict["responseStatus"]=0
        paymentgatewayresponseDict['result']="Our banking partner server is down please try after sometime!!"
        return paymentgatewayresponseDict


def check_wowpe_payin_paymentstatus(get_api_key,get_secret_key,get_base_url,pgOrderId):
    payinPaymentstatusResponseDict = {"responseStatus":0,"result":""}
    responseBody = {}
    try:
        responseBody = {
        "clientId": get_api_key,
        "secretKey": get_secret_key,
        "orderId": pgOrderId
        }
        url = get_base_url+"/order-status"

        headers = {"accept": "application/json","content-type": "application/json"}
        try:
            response = requests.post(url, json=responseBody, headers=headers)
            wowpeJsonResponseData = json.loads(response.text)
            print(wowpeJsonResponseData,"********WOWPE PAY IN ORDER STATUS data***********")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            payinPaymentstatusResponseDict["result"]="Our banking partner server is down please try after sometime!!"

        transactionData=[wowpeJsonResponseData]
        bankRefNo = ""

        if wowpeJsonResponseData:
            paymentStatus=3
            status="pending"
            if wowpeJsonResponseData.get('statusCode')==0:
                paymentStatus=3
                status="pending"
            elif wowpeJsonResponseData.get('statusCode')==1 and wowpeJsonResponseData.get('status')==1:
                paymentStatus=1
                status = "success"
                bankRefNo=wowpeJsonResponseData.get('bankRefNo')
            elif wowpeJsonResponseData.get('statusCode')==1 and wowpeJsonResponseData.get('status')==0:
                status = "failed"
                paymentStatus=0
            elif wowpeJsonResponseData.get('statusCode')==1 and  wowpeJsonResponseData.get('status')==4:
                status="reversal"
                paymentStatus=4
            else:
                status="pending"

            payinPaymentstatusResponseDict = {
            "responseStatus":1,
            "paymentStatus":paymentStatus,
            "status":status,
            "currency":wowpeJsonResponseData.get("currency"),
            "message":wowpeJsonResponseData.get("message"),
            "bankRefNo":bankRefNo,
            'payment_mode':wowpeJsonResponseData.get("paymentMode"),
            'response_code':wowpeJsonResponseData.get("status"),
            'orderAmount':wowpeJsonResponseData.get("amount"),
            "transactionData":transactionData
            }
        else:
            payinPaymentstatusResponseDict = {
            "status":"failed",
            "message":"failed"
            }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payinPaymentstatusResponseDict

#####################################################################################################################################################################################