from appservices.common.util import *


def epay_decrypt(ciphertext,encryption_key,encryption_iv):
    encryption_key = base64.b64decode(encryption_key)[:32]  
    encryption_iv = base64.b64decode(encryption_iv) 
    
    ciphertext_bytes = binascii.unhexlify(ciphertext)  
    cipher = AES.new(encryption_key, AES.MODE_CBC, encryption_iv) 
    decrypted_data = unpad(cipher.decrypt(ciphertext_bytes), AES.block_size)  
    return decrypted_data.decode('utf-8') 

def epay_encrypt(plaintext,encryption_key,encryption_iv):
    print("plaintext in encrypt",plaintext)
    print("encryption_key",encryption_key)
    print("encryption_iv",encryption_iv)
    encryption_key = base64.b64decode(encryption_key)[:32]  
    encryption_iv = base64.b64decode(encryption_iv) 

    cipher = AES.new(encryption_key, AES.MODE_CBC, encryption_iv) 
    encrypted_data = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))  
    encrypted_hex = binascii.hexlify(encrypted_data).decode() 
    return encrypted_hex



def getepayintent(get_base_url,encryption_key,encryption_iv,mid, return_url, callback_url, terminalId,amount,email,name,phone,currency,pgOrderId,transactionType,payInPaymentGatewayId,client_ip,note,apiType,userId,vpa):
    data_status = {"responseStatus":0,"result":""}
    try:
        paymentgatewayresponseDict = {}

        
        request_data = {
        "mid": mid,
        "amount": amount,  
        "merchantTransactionId": pgOrderId,
        "transactionDate":datetime.datetime.now().strftime("%a %b %d %H:%M:%S IST %Y"),
        "terminalId": terminalId,
        "udf1": phone,
        "udf2": email,
        "udf3": name,
        "udf4": "",
        "udf5": "",
        "udf6": "",
        "udf7": "",
        "udf8": "",
        "udf9": "",
        "udf10": "",
        "ru": return_url,
        "bankId": "",
        "callbackUrl": callback_url,
        "currency": currency,
        "paymentMode": "ALL",
        "txnType": "single",
        "productType": "Online Course",
        "txnNote": "",
        "vpa": vpa
        }
        plaintext = json.dumps(request_data)   
        try:
            print(" in getepayintent")
            encrypted_request = epay_encrypt(plaintext,encryption_key,encryption_iv)

            url = str(get_base_url)+"/generateInvoice"
            requestData = [request_data]
            save_getepay_api_log_table = save_api_logs_data(userId, "payin", "getepayintent", url, payInPaymentGatewayId, requestData, client_ip, apiType)

            
            headers = {'Content-Type': 'application/json'}
            payload = {
                "mid": mid,
                "terminalId": terminalId,
                "req": encrypted_request
            }

            response = requests.post(url, json=payload, headers=headers)
            print(response.text,"(((((((((((response.text)))))))))))")
            response_data = response.text
            response_data = json.loads(response_data)
            print(response_data,"((((((((((((((((response_data))))))))))))))))")
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["responseStatus"]=0
            data_status["result"]="Our banking partner server is down, please try after some time!!"
            return data_status
            

        if response_data.get('status') == "SUCCESS":

            if 'response' in response_data:
                try:
                    decrypted_response = epay_decrypt(response_data['response'],encryption_key,encryption_iv)
                    response_dict = json.loads(decrypted_response)
                    print(response_dict)
                    print(type(response_dict))
                    print(response_dict.get('paymentUrl'))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    data_status["responseStatus"]=0
                    data_status["result"]="Our banking partner server is down, please try after some time!!"
                    return data_status
                    
                print(response_dict,"((((((((((((((((((((getepayintent response_dict))))))))))))))))))))")
                save_getepay_api_log_table.update(responseData=[response_dict], responseDate=datetime.datetime.now())

                paymentgatewayresponseDict = {
                "responseStatus":1,
                "pgOrderId":pgOrderId,
                "upi_intent_url":response_dict.get('paymentUrl'),
                "payment_request_id":response_dict.get('paymentId'),
                "qrIntent":response_dict.get('qrIntent'),
                "qrPath":response_dict.get('qrPath'),
                "transactionData":[response_dict],
                "paymentChannel":"Getepay",
                "result":"Success"
                }
                print(paymentgatewayresponseDict,"getepay paymentgatewayresponseDict")
                return paymentgatewayresponseDict
            else:
                paymentgatewayresponseDict["responseStatus"] = 0
                paymentgatewayresponseDict["error"] = "Our banking partner server is down, please try after some time!"
                return paymentgatewayresponseDict
            # else:
            #     paymentgatewayresponseDict["responseStatus"] = 0
            #     paymentgatewayresponseDict["error"] = f"Failed to generate invoice. Status: {response_data.get('status')}"
            #     return paymentgatewayresponseDict
        else:
            paymentgatewayresponseDict["responseStatus"] = 0
            paymentgatewayresponseDict["error"] = f"Request failed with status code: {response.status_code}"
            return paymentgatewayresponseDict

    except Exception as e:
        app.logger.error(traceback.format_exc())
        paymentgatewayresponseDict["responseStatus"] = 0
        paymentgatewayresponseDict["error"] = "Our banking partner server is down, please try after some time!"
        return paymentgatewayresponseDict

   
def getepaypaymentseamless(encryption_key,encryption_iv, return_url,amount,name,phone,currency,pgOrderId,client_ip,token,cardNumber,month,year,cvc,paymentMode):
    data_status = {"responseStatus":0,"result":""}
    try:
        pMode="UPI"
        paymentgatewayresponseDict = {}
        if paymentMode.lower() == "credit card":
            pMode="CC"
        elif paymentMode=="debit card":
            pMode="DC"
        elif paymentMode.lower() == "net banking":
            pMode="NB"
        else:
            pMode="UPI"

        request_data = {
        "token": token,
        "browserLanguage": "en-GB",
        "browserColorDepth": "24",
        "browserScreenHeight": "768",
        "browserScreenWidth": "1366",
        "browserTZ": "-330",
        "javaEnabled": "false",
        "jsEnabled": "true",
        "login": "merchant",
        "ipAddress":client_ip,
        "amt": amount,  
        "transactionId": pgOrderId,
        "number": cardNumber,
        "ru": return_url,
        "month":month,
        "year": year,
        "txncurr": currency,
        "paymentMode": pMode,
        "cvc": cvc,
        "name": name,
        "mobile": phone
        }

        plaintext = json.dumps(request_data)   
        try:
            print(" in getepayintent seamless")
            encrypted_request = epay_encrypt(plaintext,encryption_key,encryption_iv)
            data_status["responseStatus"]=1
            data_status["encrypted_request"]=encrypted_request
            data_status["result"]="success"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["responseStatus"]=0
            data_status["result"]="Our banking partner server is down, please try after some time!!"
            return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        paymentgatewayresponseDict["responseStatus"] = 0
        paymentgatewayresponseDict["error"] = "Our banking partner server is down, please try after some time!"
        return paymentgatewayresponseDict




# def getepay_status_check(mid, statusCheckId, transactionDate, terminalId, encryption_key, encryption_iv, get_base_url):
#     paymentgatewayresponseDict = {}
#     try:
#         request_body = {
#             "mid": mid,
#             "paymentId": statusCheckId,
#             "referenceNo": "",
#             "status": "",
#             "terminalId": terminalId
#         }

#         status_check_request_body = json.dumps(request_body)
#         encrypted_request = epay_encrypt(status_check_request_body,encryption_key, encryption_iv)
#         url = str(get_base_url) + "/invoiceStatus"

#         try:
#             response = requests.post(url, data=encrypted_request)
#             decrypt_data = response.text
#             decrypted_data = epay_decrypt(decrypt_data)
#             getepay_response_data = json.loads(decrypted_data.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 some time!!"
#             return paymentgatewayresponseDict

#         bankRefNo = ""
#         transactionData = [getepay_response_data]
#         amount = getepay_response_data.get("txnAmount", {})
#         paymentMode = getepay_response_data.get("paymentMode", {})
#         txnAmount = getepay_response_data.get("txnAmount", {})

#         txnStatus = getepay_response_data.get("txnStatus", {})

def getepay_status_check(mid, pgOrderId, terminalId, encryption_key, encryption_iv, get_base_url):
    paymentgatewayresponseDict = {}
    try:
        request_body = {
            "mid": mid,
            "paymentId": pgOrderId,
            "referenceNo": "",
            "status": "",
            "terminalId": terminalId
        }
        status_check_request_body = json.dumps(request_body)
        print(" in get epay status check ")
        encrypted_request = epay_encrypt(status_check_request_body, encryption_key, encryption_iv)
        url = str(get_base_url) + "/invoiceStatus"

        try:
            headers = {'Content-Type': 'application/json'}
            payload = {
                "mid": mid,
                "terminalId": terminalId,
                "req": encrypted_request
            }
            response = requests.post(url, json=payload, headers=headers)
            print(response,"response")
            decrypt_data = response.text
            print(decrypt_data,"decrypt_data response")
            print(type(decrypt_data),"decrypt_data response type")
            decryptedResponse = json.loads(decrypt_data)
            

            decrypted_data = epay_decrypt(decryptedResponse.get("response"),encryption_key,encryption_iv)
            # decrypted_data = epay_decrypt(decrypt_data['response'],encryption_key,encryption_iv)
            getepay_response_data = json.loads(decrypted_data)
            print(getepay_response_data,"(((((((((((((((getepay_response_data get e pay status check)))))))))))))))")
        except Exception:
            app.logger.error(traceback.format_exc())
            paymentgatewayresponseDict["responseStatus"] = 0
            paymentgatewayresponseDict["result"] = "Our banking partner server is down, please try after some time!!"
            return paymentgatewayresponseDict

        bankRefNo = ""
        transactionData = [getepay_response_data]
        txnAmount = getepay_response_data.get("txnAmount",0)
        payment_status = getepay_response_data.get("paymentStatus", '')
        paymentMode = getepay_response_data.get("paymentMode", '')

        if payment_status == "SUCCESS":
            paymentStatus = 1
            status = "success"
        elif payment_status == "FAILED":
            status = "failed"
            paymentStatus = 0
        else:
            status = "pending"
            paymentStatus = 3

        if paymentMode == "UPI":
            paymentMode = "UPI"
        elif paymentMode == "CC":
            paymentMode = "CREDIT CARD"
        elif paymentMode == "DC":
            paymentMode = "DEBIT CARD"
        elif paymentMode == "NB":
            paymentMode = "NET BANKING"
        elif paymentMode == "CASH":
            paymentMode = "WALLET"
        elif paymentMode == "NEFT":
            paymentMode = "NEFT"


        paymentgatewayresponseDict = {
            "responseStatus": 1,
            "paymentStatus": paymentStatus,
            "status": status,
            "currency": "INR",
            "message": "",
            "bankRefNo": bankRefNo,
            "cardType": "",
            "customerVpa": "",
            "paymentMode": paymentMode,
            "response_code": "",
            "orderAmount": txnAmount,
            "transactionData": transactionData
        }
        return paymentgatewayresponseDict

    except Exception:
        app.logger.error(traceback.format_exc())
        paymentgatewayresponseDict["responseStatus"] = 0
        paymentgatewayresponseDict["result"] = "Our banking partner server is down, please try after some time!!"
        return paymentgatewayresponseDict





# def getepayreturnurl():
#     try:
#         # Assuming data is sent as JSON in the POST request
#         response_data = request.json  # Access the JSON payload
#         if not response_data or 'response' not in response_data:
#             return jsonify({"error": "Missing 'response' parameter"}), 400

#         response_encrypted = response_data['response']
#         print(response_encrypted, "((((( Received Encrypted Response )))))")

#         # Uncomment and use this if decryption is required
#         key = "JoYPd+qso9s7T+Ebj8pi4Wl8i+AHLv+5UNJxA3JkDgY="
#         iv = "hlnuyA9b4YxDq6oJSZFl8g=="
#         aes_cryptor = AESCryptor(key, iv)

#         decrypted_data = aes_cryptor.decrypt(response_encrypted)
#         decrypted_data = json.loads(decrypted_data)  # Convert decrypted string to JSON
#         print("Decrypted Data:", decrypted_data)

#         return jsonify(decrypted_data)  # Return the decrypted data as JSON

#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         return jsonify({"error": f"An error occurred: {str(e)}"}), 500

# @getepay.route("/getepaycallbackurl", methods=["GET"])
# def getepaycallbackurl():

#     data_status = {"responseStatus": 0, "result": ""}
#     print(request.json,"connect bank callback json url")
#     print(request.form,"connect bankallback form url")
#     print(request.data,"connect bankallback data url")
#     return data_status

















# @getepay.route("/test_route",methods=["POST","GET"])
# def test_route():
    
#      return render_template("super_admin_templates/getepay.html")