from appservices.common.util import *


def lyra_payin_payment_intent(get_base_url,orderId,orderInfo,amount,currency,name,phone,email,webhook_url,return_url,userId,transactionAPIId,client_ip,apiType,user_name,password):
    lyraPaymentResponseJsonData = {}
    paymentgatewayresponseDict = {}
    try:
        amount=float(amount)*100
        amount=int(amount)
        amount=str(amount)
        # Prepare request data in the required format
        lyraPayinRequestData = {
            "orderId": orderId,
            "orderInfo": orderInfo,
            "currency": currency,
            "amount": amount,
            "customer": {
                "name": name,
                "emailId": email,
                "phone": phone
            },
            "webhook": {
                "url": webhook_url
            },
            "return": {
                "method": "POST",
                "url": return_url,
                "timeout": 600
            }
        }
        url = get_base_url + "/charge"


        headers = { 
            'Content-Type': 'application/json'
        }
        requestData = [lyraPayinRequestData] 
        save_api_log_table = save_api_logs_data(userId,"payin",apiType,url,transactionAPIId,requestData,client_ip,"api") 
        
        print(lyraPayinRequestData,"LYRA PAYIN RequestData")
        print(headers,"LYRA PAYIN HEADERS")
        try:
            lyraPayinResponse = requests.post(url, json=lyraPayinRequestData, headers=headers,auth=HTTPBasicAuth(user_name,password))
            lyraPaymentResponseJsonData = json.loads(lyraPayinResponse.text)
            print(lyraPaymentResponseJsonData,"((((((((((lyraPaymentResponseJsonData))))))))))")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            paymentgatewayresponseDict["responseStatus"] = 0
            paymentgatewayresponseDict['result'] = "Our banking partner server is down, please try again later."
            return paymentgatewayresponseDict


        save_api_log_table.update(responseData=[lyraPaymentResponseJsonData], responseDate=datetime.datetime.now())
     
        data = lyraPaymentResponseJsonData
        error = lyraPaymentResponseJsonData.get("error", {})
        transactionData = [lyraPaymentResponseJsonData]
        payment_request_id = lyraPaymentResponseJsonData.get("uuid")
        pgOrderId = lyraPaymentResponseJsonData.get("orderId")
        upi_intent_url = lyraPaymentResponseJsonData.get("paymentLink")

        if data.get("paymentLink"):
            if data.get("paymentLink") != None:
                paymentgatewayresponseDict = {
                    "responseStatus": 1,
                    "pgOrderId": pgOrderId,
                    "upi_intent_url": upi_intent_url,  
                    "payment_request_id":payment_request_id,
                    "transactionData": transactionData,
                    "paymentChannel": "Lyra",
                    "result": "Success"
                }
                return paymentgatewayresponseDict
            else:
                paymentgatewayresponseDict = {
                    "responseStatus": 0,
                    "result": error.get("message", "Request failed due to an error.")
                }
                return paymentgatewayresponseDict
        else:
            paymentgatewayresponseDict = {
                "responseStatus": 0,
                "result": error.get("message", "Request failed due to an error.")
            }
            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

# Exisiting Code
# def check_lyra_payin_paymentstatus(get_base_url,uuid,user_name,password):
#     paymentStatusResponseDict = {}
#     try:
#         url = get_base_url+"/charge/"+uuid 
#         print(url,"((((URL))))")
#         headers = {
#             'Content-Type': 'application/json'
#         }
#         print(headers,"((((((HEADERS))))))")
#         try:
#             response = requests.get(url, headers=headers,auth=HTTPBasicAuth(user_name,password))
#             paymentStatusResponseJsonData = json.loads(response.text)
#             print(paymentStatusResponseJsonData,"(((((((((LYRA PAYIN CHECK STATUS RESPONSE)))))))))")
#         except Exception as e:
#             app.logger.error(traceback.format_exc())
#             paymentStatusResponseDict["responseStatus"] = 0
#             paymentStatusResponseDict['result'] = "Our banking partner server is down, please try again later."
#             return paymentStatusResponseDict
#         if not paymentStatusResponseJsonData:
#             paymentStatusResponseDict['result'] = "Our banking partner server is down, please try again later."
#             return paymentStatusResponseDict

#         order_id = paymentStatusResponseJsonData.get("orderId", "")
#         payment_datetime = paymentStatusResponseJsonData.get("date","")
#         currency = paymentStatusResponseJsonData.get("currency", "INR")
#         amount = paymentStatusResponseJsonData.get("amount", "")
#         attempts = paymentStatusResponseJsonData.get("attempts", "")
#         transaction_id = paymentStatusResponseJsonData.get("uuid", "")
#         response_code = paymentStatusResponseJsonData.get("status", "")

#         transactionsList=paymentStatusResponseJsonData.get('transactions')
#         customerDict=paymentStatusResponseJsonData.get('customer')
#         name=customerDict.get('name')
#         phone=customerDict.get('phone')
#         email=customerDict.get('email')
#         bank_ref_id=""
#         paymentMode=""
#         cardType=""
#         cardmasked=""
#         issuingBank=""
#         customerVpa=""
#         payeeVpa=""  
#         status=""  
#         transactionData = [paymentStatusResponseJsonData]
#         errorMessage = ""
    
#         if response_code == "PAID":
#             transactionstatus = 1
#             errorMessage = "Success"
#             status="success"
#             for each_transaction in transactionsList:
#                 if each_transaction.get('status')=="ACCEPTED":
#                     if each_transaction.get('family')=="CARD":
#                         if each_transaction.get('cardType')=="CREDIT":
#                             paymentMode="CREDIT CARD"
#                         else:
#                             paymentMode="DEBIT CARD"    
#                         bank_ref_id=each_transaction.get('externalId')
#                         cardmasked=each_transaction.get('cardLast4')
#                         issuingBank=each_transaction.get('issuingBank')
#                         if each_transaction.get('scheme')=="MASTERCARD":
#                             cardType="MAST"
#                         elif each_transaction.get('scheme')=="RUPAY":
#                             cardType="RUPAY"
#                         elif each_transaction.get('scheme')=="VISA":
#                             cardType="VISA"
#                         else:
#                             cardType=each_transaction.get('scheme')
#                     elif each_transaction.get('family')=="NET_BANKING":
#                         paymentMode="NET BANKING"
#                         bank_ref_id=each_transaction.get('externalId')
#                     elif each_transaction.get('family')=="UPI":
#                         paymentMode="UPI"
#                         bank_ref_id=each_transaction.get('rrn')
#                         customerVpa=each_transaction.get('payerVpa')
#                         payeeVpa=each_transaction.get('payeeVpa')
#                     else:
#                         bank_ref_id=each_transaction.get('externalId')
#         elif response_code == "DROPPED":
#             transactionstatus = 0
#             status="failed"
#             transactionCount=len(transactionsList)-1
#             errorMessage = transactionsList[transactionCount]['error']
#             payment_option=""
#             if 'payment_option' in transactionsList[transactionCount]:
#                 payment_option=transactionsList[transactionCount]['payment_option']
#             else:
#                 payment_option=transactionsList[transactionCount]['family']

#             if payment_option=="NET_BANKING":
#                 paymentMode="NET BANKING"
#                 bank_ref_id=transactionsList[transactionCount]['externalId']
#             elif payment_option=="UPI":
#                 paymentMode="UPI"
#                 bank_ref_id=transactionsList[transactionCount]['rrn']
#                 customerVpa=transactionsList[transactionCount]['payerVpa']
#                 payeeVpa=transactionsList[transactionCount]['payeeVpa']
#             elif payment_option=="CARD":
#                 if transactionsList[transactionCount]['cardType']=="CREDIT":
#                     paymentMode="CREDIT CARD"
#                 else:
#                     paymentMode="DEBIT CARD"
#                 cardmasked=transactionsList[transactionCount]['cardLast4']
#                 issuingBank=transactionsList[transactionCount]['issuingBank']
#                 bank_ref_id=""
#                 if transactionsList[transactionCount]['scheme']=="MASTERCARD":
#                     cardType="MAST"
#                 elif transactionsList[transactionCount]['scheme']=="RUPAY":
#                     cardType="RUPAY"
#                 elif transactionsList[transactionCount]['scheme']=="VISA":
#                     cardType="VISA"
#                 else:
#                     cardType=transactionsList[transactionCount]['scheme']
#         else:
#             transactionstatus = 3
#             errorMessage = "Pending"
#             status="pending"

#         paymentStatusResponseDict = {
#         "responseStatus":1,
#         "paymentStatus":transactionstatus,
#         "status":status,
#         "currency":"INR",
#         "message":errorMessage,
#         "bankRefNo":bank_ref_id,
#         "cardType":cardType,
#         "customerVpa":customerVpa,
#         "cardmasked":cardmasked,
#         'payment_mode':paymentMode,
#         'pgOrderId':order_id,
#         'response_code':transactionstatus,
#         'orderAmount':amount,
#         "transactionData":transactionData
#         }
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         paymentStatusResponseDict["responseStatus"] = 0
#         paymentStatusResponseDict['result'] = "An error occurred. Please try again later."
    
#     return paymentStatusResponseDict

def check_lyra_payin_paymentstatus(get_base_url,uuid,user_name,password):
    paymentStatusResponseDict = {}
    try:
        url = get_base_url+"/charge/"+uuid 
        print(url,"((((URL))))")
        headers = {
            'Content-Type': 'application/json'
        }
        print(headers,"((((((HEADERS))))))")
        try:
            response = requests.get(url, headers=headers,auth=HTTPBasicAuth(user_name,password))
            paymentStatusResponseJsonData = json.loads(response.text)
            print(paymentStatusResponseJsonData,"(((((((((LYRA PAYIN CHECK STATUS RESPONSE)))))))))")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            paymentStatusResponseDict["responseStatus"] = 0
            paymentStatusResponseDict['result'] = "Our banking partner server is down, please try again later."
            return paymentStatusResponseDict

        if not paymentStatusResponseJsonData:
            paymentStatusResponseDict['result'] = "Our banking partner server is down, please try again later."
            return paymentStatusResponseDict

        order_id = paymentStatusResponseJsonData.get("orderId", "")
        payment_datetime = paymentStatusResponseJsonData.get("date","")
        currency = paymentStatusResponseJsonData.get("currency", "INR")
        amount = paymentStatusResponseJsonData.get("amount", "")
        attempts = paymentStatusResponseJsonData.get("attempts", "")
        transaction_id = paymentStatusResponseJsonData.get("uuid", "")
        response_code = paymentStatusResponseJsonData.get("status", "")

        transactionsList=paymentStatusResponseJsonData.get('transactions')
        customerDict=paymentStatusResponseJsonData.get('customer')
        dropReason=paymentStatusResponseJsonData.get('dropReason',"")
        name=customerDict.get('name')
        phone=customerDict.get('phone')
        email=customerDict.get('email')
        
        bank_ref_id=""
        paymentMode=""
        cardType=""
        cardmasked=""
        issuingBank=""
        customerVpa=""
        payeeVpa=""  
        status=""  
        transactionData = [paymentStatusResponseJsonData]
        errorMessage = ""
    
        if response_code == "PAID":
            transactionstatus = 1
            errorMessage = "Success"
            status="success"
            for each_transaction in transactionsList:
                if each_transaction.get('status')=="ACCEPTED":
                    if each_transaction.get('payment_option')=="CARD":
                        if each_transaction.get('cardType')=="CREDIT":
                            paymentMode="CREDIT CARD"
                        else:
                            paymentMode="DEBIT CARD"    
                        bank_ref_id=each_transaction.get('externalId')
                        cardmasked=each_transaction.get('cardLast4')
                        issuingBank=each_transaction.get('issuingBank')

                        if each_transaction.get('scheme')=="MASTERCARD":
                            cardType="MAST"
                        elif each_transaction.get('scheme')=="RUPAY":
                            cardType="RUPAY"
                        elif each_transaction.get('scheme')=="VISA":
                            cardType="VISA"
                        else:
                            cardType=each_transaction.get('scheme')
                    elif each_transaction.get('payment_option')=="NET_BANKING":
                        paymentMode="NET BANKING"
                        bank_ref_id=each_transaction.get('externalId')
                    elif each_transaction.get('payment_option')=="UPI":
                        paymentMode="UPI"
                        bank_ref_id=each_transaction.get('rrn')
                        customerVpa=each_transaction.get('payerVpa')
                        payeeVpa=each_transaction.get('payeeVpa')
                    else:
                        bank_ref_id=each_transaction.get('externalId')
        elif response_code == "DROPPED":
            transactionstatus = 0
            status="failed"
            if transactionsList == []:
                errorMessage = dropReason
                transactionstatus = 0
                status="failed"
            else:
                transactionCount=len(transactionsList)-1
                errorMessage = transactionsList[transactionCount]['error']
                payment_option=""
                if 'payment_option' in transactionsList[transactionCount]:
                    payment_option=transactionsList[transactionCount]['payment_option']
                else:
                    payment_option=transactionsList[transactionCount]['family']

                if payment_option=="NET_BANKING":
                    paymentMode="NET BANKING"
                    bank_ref_id=transactionsList[transactionCount]['externalId']
                elif payment_option=="UPI":
                    paymentMode="UPI"
                    bank_ref_id=transactionsList[transactionCount]['rrn']
                    customerVpa=transactionsList[transactionCount]['payerVpa']
                    payeeVpa=transactionsList[transactionCount]['payeeVpa']
                elif payment_option=="CARD":
                    if transactionsList[transactionCount]['cardType']=="CREDIT":
                        paymentMode="CREDIT CARD"
                    else:
                        paymentMode="DEBIT CARD"
                    cardmasked=transactionsList[transactionCount]['cardLast4']
                    issuingBank=transactionsList[transactionCount]['issuingBank']
                    bank_ref_id=""
                    if transactionsList[transactionCount]['scheme']=="MASTERCARD":
                        cardType="MAST"
                    elif transactionsList[transactionCount]['scheme']=="RUPAY":
                        cardType="RUPAY"
                    elif transactionsList[transactionCount]['scheme']=="VISA":
                        cardType="VISA"
                    else:
                        cardType=transactionsList[transactionCount]['scheme']
        else:
            transactionstatus = 3
            errorMessage = "Pending"
            status="pending"

        paymentStatusResponseDict = {
        "responseStatus":1,
        "paymentStatus":transactionstatus,
        "status":status,
        "currency":"INR",
        "message":errorMessage,
        "bankRefNo":bank_ref_id,
        "cardType":cardType,
        "customerVpa":customerVpa,
        "cardmasked":cardmasked,
        'payment_mode':paymentMode,
        'pgOrderId':order_id,
        'response_code':transactionstatus,
        'orderAmount':amount,
        "transactionData":transactionData
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
        paymentStatusResponseDict["responseStatus"] = 0
        paymentStatusResponseDict['result'] = "An error occurred. Please try again later."
    return paymentStatusResponseDict