from appservices.common.util import *

###################################################### Accure Payout API's #########################################################################
def accurepay_payout_fundtransfer(get_api_key,get_salt,get_base_url,userId,payOutPaymentGatewayId,client_ip,amount,transfer_type,account_name,account_number,ifsc_code,bank_name,clientOrderId,apiType):
    paymentgatewayresponseDict = {}
    try:
        accurepay_payout_request_body = {
        'api_key': get_api_key,
        'merchant_reference_number': clientOrderId,
        'amount': amount,
        'transfer_type': transfer_type,
        'account_name': account_name,
        'account_number': account_number,
        'ifsc_code': ifsc_code,
        'bank_name': bank_name
        }
        print(accurepay_payout_request_body,"(((((((((((accurepay_payout_request_body)))))))))))")
        hashvalue = Sha512Hash(accurepay_payout_request_body,get_salt)
        accurepay_payout_request_body.update({"hash": hashvalue})

        try:
            url = get_base_url+"/fundtransfer"
            headers = {'Content-type': 'application/json'}
            accurePayResponseData = requests.post(url, json=accurepay_payout_request_body, headers=headers)
            accurePayResponseJsonData = json.loads(accurePayResponseData.text)
            print(accurePayResponseJsonData,"(((((((((((((Accurepay 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!!"

        # API Logs Table Saving Here
        requestData=[accurepay_payout_request_body]
        save_api_log_table = save_api_logs_data(userId,"payout","fund_transfer",url,payOutPaymentGatewayId,requestData,client_ip,apiType)

        save_api_log_table.update(responseData=[accurePayResponseJsonData],responseDate=datetime.datetime.now())
        transactionData = [accurePayResponseJsonData]

        data = accurePayResponseJsonData.get("data", {})
        error = accurePayResponseJsonData.get("error", {})

        transactionstatus=2
        bank_reference_number=""
        transaction_id=""
        message = "PROCESSING"
        status = "PROCESSING"
        if data.get("status") == "SUCCESS":
            status = "SUCCESS"
            transactionstatus=1
            if data.get("transaction_id")==None:
                transaction_id=data.get("internal_id")
            else:
                transaction_id=data.get("transaction_id")
            message = "Transaction is successful!"
        elif data.get("status") == "PROCESSING" or data.get("status") == "PENDING" or data.get("status") == "INCOMPLETE" or data.get("status") == "SENT_TO_BENEFICIARY":
            transactionstatus=2
            status = "PROCESSING"
            if data.get("transaction_id")==None:
                transaction_id=data.get("internal_id")
            else:
                transaction_id=data.get("transaction_id")
            message = "Processing"
        elif data.get("status") == "RETURNED_FROM_BENEFICIARY":
            transactionstatus=4
            status = "REVERSAL"
            message = "REVERSAL"
        elif error.get("code") == 1023:
            transactionstatus=0
            status = "FAILED"
            message = "Invalid given details!!"

        elif error.get("code") == 1028:
            transactionstatus=0
            status = "FAILED"
            message = "Invalid request!!"

        elif error.get("code") == 1029:
            transactionstatus=0
            status = "FAILED"
            message = "Transaction Terminated!!"

        elif error.get("code") == 1015:
            transactionstatus=0
            status = "FAILED"
            message = "Invalid request!!"

        elif error.get("message"):
            transactionstatus=0
            status = "FAILED"
            message = error.get("message")
        else:
            transactionstatus=0
            status = "FAILED"
            message = error.get("message")

        paymentgatewayresponseDict={
        'responseStatus':1,
        'status':status,
        'transactionstatus':transactionstatus,
        "messages":message,
        "bank_reference_number":"",
        "transaction_id":transaction_id,
        "transactionData":transactionData,
        }
    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 accurepay_payout_fundtransfer_status(get_api_key,get_salt,pgOrderId,get_base_url,fund_transfer_queryset):
    paymentgatewayResponseStatusDict = {}
    responseBody = {}
    try:
        requestBody = {
        "api_key":get_api_key,
        "merchant_reference_number":pgOrderId
        }
        hashValue = Sha512Hash(requestBody,get_salt)

        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        payload = "api_key="+get_api_key+"&merchant_reference_number="+pgOrderId+"&hash="+hashValue
        try:
            accurePayResponseData = requests.post(get_base_url+"/fundtransferstatus", data=payload, headers=headers)
            accurePayResponseJsonData = json.loads(accurePayResponseData.text)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            paymentgatewayResponseStatusDict["result"]="Our banking partner server is down please try after sometime!!"
            return paymentgatewayResponseStatusDict
        
        if not accurePayResponseJsonData:
            paymentgatewayResponseStatusDict["result"]="Our banking partner server is down please try after sometime!!"
            return paymentgatewayResponseStatusDict

        transactionData = [accurePayResponseJsonData]

        data = accurePayResponseJsonData.get("data", {})
        error = accurePayResponseJsonData.get("error", {})


        bankReferenceNumber=""
        message=""
        transactionUniqueId=""
        textStatus=""

        bankReferenceNumber=fund_transfer_queryset.bankReferenceNumber


        status = data.get("status")
        transactionstatus=2
        textStatus="PROCESSING"
        if status:
            if status == "SUCCESS":
                transactionStatus=1
                textStatus="SUCCESS"

            elif status == "PROCESSING" or status == "PENDING" or status == "INCOMPLETE" or status == "SENT_TO_BENEFICIARY":
                transactionStatus=2
                textStatus="PROCESSING"

            elif status == "FAILURE" or status == "FAILED":
                transactionStatus=0
                textStatus="FAILED"

            elif status == "RETURNED_FROM_BENEFICIARY":
                transactionStatus=4
                textStatus="REVERSAL"

        elif error.get("code"):
            transactionstatus=0
            textStatus="FAILED"
            message = error.get("message")

        transaction_id=data.get('transaction_id')
        if transaction_id:
            transactionUniqueId=str(transaction_id)
        else:
            transactionUniqueId=str(fund_transfer_queryset.transactionUniqueId)
            
        paymentgatewayResponseStatusDict ={
        "responseStatus":1,
        "transactionStatus":transactionStatus,
        "bankReferenceNumber":bankReferenceNumber,
        "textStatus":textStatus,
        "error_message":message,
        "transaction_id":transactionUniqueId,
        "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

##################################################################################################################################################

###################################################### Accure Payin API's #########################################################################

def accure_payin_payment_intent(get_api_key,get_salt,get_base_url,name,phone,email,amount,pgOrderId,userId,currency,orderId,mode,address_line_1,address_line_2,city,state,country,zip_code,udf1,udf2,udf3,udf4,udf5,return_url,transactionAPIId,client_ip,note,apiType):
    accurePayResponseJsonData={}
    paymentgatewayresponseDict = {}
    try:
        accurePayRequestData = {
        "api_key":get_api_key,
        "order_id":pgOrderId,
        "mode":mode,
        "amount":amount,
        "currency":currency,
        "description":note,
        "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,
        "return_url":return_url
        }
        hashvalue = Sha512Hash(accurePayRequestData,get_salt)
        accurePayRequestData.update({"hash": hashvalue})

        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        payload = "api_key="+get_api_key+"&order_id="+accurePayRequestData.get('order_id')+"&mode="+accurePayRequestData.get('mode')+"&amount="+str(accurePayRequestData.get('amount'))+"&currency="+accurePayRequestData.get('currency')+"&description="+accurePayRequestData.get('description')+"&name="+accurePayRequestData.get('name')+"&email="+accurePayRequestData.get('email')+"&phone="+accurePayRequestData.get('phone')+"&address_line_1="+accurePayRequestData.get('address_line_1')+"&address_line_2="+accurePayRequestData.get('address_line_2')+"&city="+accurePayRequestData.get('city')+"&state="+accurePayRequestData.get('state')+"&country="+accurePayRequestData.get('country')+"&zip_code="+accurePayRequestData.get('zip_code')+"&udf1="+accurePayRequestData.get('udf1')+"&udf2="+accurePayRequestData.get('udf2')+"&udf3="+accurePayRequestData.get('udf3')+"&udf4="+accurePayRequestData.get('udf4')+"&udf5="+accurePayRequestData.get('udf5')+"&return_url="+accurePayRequestData.get('return_url')+"&hash="+accurePayRequestData.get('hash')
        
        url=get_base_url+"getpaymentrequestintenturl"

        requestData=[payload]
        save_api_log_table = save_api_logs_data(userId,"payin","intent",url,transactionAPIId,requestData,client_ip,apiType)

        
        try:
            responseData = requests.post(url, data=payload, headers=headers)
            accurePayResponseJsonData = json.loads(responseData.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

        # For update response data in api log table
        save_api_log_table.update(responseData=[accurePayResponseJsonData],responseDate=datetime.datetime.now())

        data = accurePayResponseJsonData.get("data", {})
        error = accurePayResponseJsonData.get("error", {})
        transactionData = [accurePayResponseJsonData]

        if data.get("data"):
            if data.get("upi_intent_url") != None:
                paymentgatewayresponseDict={
                "responseStatus":1,
                "pgOrderId":pgOrderId,
                "upi_intent_url":data.get("upi_intent_url"),
                "payment_request_id":data.get("payment_request_id"),
                "transactionData":transactionData,
                "paymentChannel":"Accurepay",
                "result":"Success"
                }
            else:
                paymentgatewayresponseDict = {"responseStatus":2,"result":"Request failed with status code BadRequest"}
        else:
            paymentgatewayresponseDict={"responseStatus":0,"result":error.get("message")}
    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_accurepay_payin_paymentstatus(get_api_key,get_salt,get_base_url,pgOrderId):
    payinPaymentstatusResponseDict = {"responseStatus":0,"result":""}
    responseBody = {}
    try:
        responseBody = {
        "api_key": get_api_key,
        "order_id": pgOrderId
        }
        url = get_base_url+"/paymentstatus"

        hashvalue = Sha512Hash(responseBody,get_salt)
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        try:
            payload = "api_key="+get_api_key+"&order_id="+pgOrderId+"&hash="+hashvalue
            respnseData = requests.post(get_base_url+"paymentstatus", data=payload, headers=headers)
            accurepayJsonResponseData = json.loads(respnseData.text)
        except Exception as e:
            app.logger.error(traceback.format_exc())
            payinPaymentstatusResponseDict["result"]="Our banking partner server is down please try after sometime!!"

        data = accurepayJsonResponseData.get("data", {})
        error = accurepayJsonResponseData.get("error", {})
        transactionData = [accurepayJsonResponseData]

        resdata=accurepayJsonResponseData["data"]
        if resdata[0].get("response_code")== 0 or resdata[0].get("response_code")== 1000:
            paymentStatus=0
            status = "failed"
            if resdata[0].get("response_code")== 0:
                paymentStatus=1
                status = "success"

            payinPaymentstatusResponseDict = {
            "responseStatus":1,
            "paymentStatus":paymentStatus,
            "status":status,
            "currency":"",
            "message":resdata[0].get("error_desc"),
            "bankRefNo":"",
            'payment_mode':resdata[0].get("payment_mode"),
            'response_code':resdata[0].get("response_code"),
            'orderAmount':resdata[0].get("amount"),
            "transactionData":transactionData
            }
        else:
            payinPaymentstatusResponseDict = {
            "status":"failed",
            'response_message':error.get("message")
            }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payinPaymentstatusResponseDict