from appservices.common.util import *


###################################################### Setu Payin API's #########################################################################


def setu_login(get_client,get_secret,get_base_url,get_auth_url,grant_type,payinPaymentGatewayId,client_ip,apiType,userId):
    loginResponseDict = {}
    loginRequestBody = {}
    try:
        loginRequestBody = {
        "clientID": get_client,
        "secret": get_secret,
        "grant_type": grant_type
        }
        print(loginRequestBody,"SETU PAYIN Login REQUEST BODY")

        # API Logs Table Saving Here
        requestData=[loginRequestBody]
        url = get_auth_url
        save_api_log_table = save_api_logs_data(userId,"payin","setu_login",url,payinPaymentGatewayId,requestData,client_ip,apiType)

        print(url,"(((((((LOGIN URL)))))))")

        headers = {
            "accept": "application/json",
            "content-type": "application/json",
            "client":"bridge"
        }
        try:
            response = requests.post(url,json=loginRequestBody, headers=headers)
            print(response.text,"((((((((((((SETU RESPONSE TXT))))))))))))")
            loginResponseData = json.loads(response.text)
            print(loginResponseData,"(((((((((((((SETU PAYIN LOGIN RESPONSE)))))))))))))")
            # Update API Logs Table Here
            save_api_log_table.update(responseData=[loginResponseData],responseDate=datetime.datetime.now())
            if loginResponseData:
                loginResponseDict["responseStatus"]=1
                loginResponseDict["access_token"]=loginResponseData.get("access_token","")
            else:
                loginResponseDict["responseStatus"]=0
                loginResponseDict['result']="Our banking partner server is down please try after sometime!!"
            return loginResponseDict
        except Exception as e:
            app.logger.error(traceback.format_exc())
            loginResponseDict["responseStatus"]=0
            loginResponseDict['result']="Our banking partner server is down please try after sometime!!"
            return loginResponseDict
    except Exception as e:
        app.logger.error(traceback.format_exc())
        loginResponseDict["responseStatus"]=0
        loginResponseDict['result']="Our banking partner server is down please try after sometime!!"
        return loginResponseDict

def setu_payin_payment_sqr(get_client,get_secret,get_base_url,get_auth_url,grant_type,merchantId,merchantVpa,transactionNote,referenceId,amount,userId,payinPaymentGatewayId,client_ip,apiType):
    dqrResponseData = {}
    paymentgatewayresponseDict = {}
    try:
        setu_login_response_data = setu_login(get_client,get_secret,get_base_url,get_auth_url,grant_type,payinPaymentGatewayId,client_ip,apiType,userId)
        print(setu_login_response_data,"(((((((setu_login_response_data)))))))")
        if setu_login_response_data.get("responseStatus") == 1:
            access_token = setu_login_response_data.get("access_token")
            requestBody = {
            "merchantVpa": merchantVpa,
            "transactionNote": transactionNote,
            "referenceId": referenceId,
            "amount":amount
            }
            print(requestBody,"SETU PAYIN SQR REQUEST BODY")

            # API Logs Table Saving Here
            requestData=[requestBody]
            url = get_base_url+"/sqr"
            save_api_log_table = save_api_logs_data(userId,"payin","create_sqr",url,payinPaymentGatewayId,requestData,client_ip,apiType)
            print(save_api_log_table,"save_api_log_table")

            headers = {
                "accept": "application/json",
                "content-type": "application/json",
                "merchantId":merchantId,
                "Authorization":"Bearer "+access_token,
            }
            try:
                response = requests.post(url,json=requestBody, headers=headers)
                sqrResponseData = json.loads(response.text)
                print(sqrResponseData,"(((((((((((((SETU PAYIN SQR 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_api_log_table.update(responseData=[sqrResponseData],responseDate=datetime.datetime.now())
                print(sqrResponseData,"RESPONSE FOR PAYIN SQR SETU CREATE ORDER DATA")

            if sqrResponseData.get("status") == "active":
                transactionData = [sqrResponseData]
                pgOrderId = sqrResponseData.get("id")
                upi_intent_url = sqrResponseData.get("intentLink")
                payment_request_id=sqrResponseData.get("refId")

                if upi_intent_url != None:
                    paymentgatewayresponseDict={
                    "responseStatus":1,
                    "pgOrderId":pgOrderId,
                    "upi_intent_url":upi_intent_url,
                    "payment_request_id":payment_request_id,
                    "transactionData":transactionData,
                    "paymentChannel":"Setu",
                    "result":"Success"
                    }
                    return paymentgatewayresponseDict
                else:
                    paymentgatewayresponseDict = {"responseStatus":2,"result":"Request failed with BadRequest!!"}
                    return paymentgatewayresponseDict
            else:
                paymentgatewayresponseDict = {"responseStatus":0,"result":"Request failed with status code BadRequest"}
                return paymentgatewayresponseDict
        else:
            paymentgatewayresponseDict = {"responseStatus":0,"result":"Un authorized access token!!"}
            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_setu_payin_paymentstatus(get_client,get_secret,get_base_url,get_auth_url,grant_type,merchant_id,payinPaymentGatewayId,client_ip,apiType,userId,pgOrderId):
    payinPaymentstatusResponseDict = {"responseStatus":0,"result":""}
    requestBody = {}
    try:
        setu_login_response_data = setu_login(get_client,get_secret,get_base_url,get_auth_url,grant_type,payinPaymentGatewayId,client_ip,apiType,userId)
        if setu_login_response_data.get("responseStatus") == 1:
            access_token = setu_login_response_data.get("access_token")
            url = get_base_url+"/payments/"+pgOrderId

            headers = {"accept": "application/json","content-type": "application/json","merchantId":merchantId,"Authorization":"Bearer "+access_token}
            try:
                response = requests.get(url, headers=headers)
                jsonResponseData = json.loads(response.text)
                print(jsonResponseData,"********SETU 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=[jsonResponseData]
            bankRefNo = ""

            if jsonResponseData:
                if jsonResponseData.get("status")=="success":
                    paymentStatus=1
                    status = "success"
                    bankRefNo=jsonResponseData.get("rrn")
                elif jsonResponseData.get('status') == "failed":
                    status = "failed"
                    paymentStatus=0
                else:
                    paymentStatus=3
                    status="pending"

                if jsonResponseData.get("reason").get("setuDescription"):
                    message = jsonResponseData.get("reason").get("setuDescription")
                else:
                    message = status

                payinPaymentstatusResponseDict = {
                "responseStatus":1,
                "paymentStatus":paymentStatus,
                "status":status,
                "currency":jsonResponseData.get("currency"),
                "message":message,
                "bankRefNo":bankRefNo,
                'payment_mode':"UPI",
                'response_code':jsonResponseData.get("status"),
                'orderAmount':jsonResponseData.get("amount"),
                "transactionData":transactionData
                }
            else:
                payinPaymentstatusResponseDict = {
                "status":"failed",
                "message":"failed"
                }
        else:
            payinPaymentstatusResponseDict = {
            "status":"failed",
            "message":"failed"
            }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return payinPaymentstatusResponseDict