from appservices.common.util import *
from appservices.common.payment_gateways.safegold_payment_gateway import *

def common_gold_user_registration(userId,transactionApiId):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code
        
               
        user_kyc_queryset = UserKYC.objects(userId=userId,status=1).first()
        if not user_kyc_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        userName = user_kyc_queryset.userId.fullName
        user_mobile_number = user_kyc_queryset.userId.phoneNumber
        user_email = user_kyc_queryset.userId.email
        user_pincode = str(user_kyc_queryset.userId.pincodeId.pincode)
        user_aadhar_number = str(user_kyc_queryset.aadharNumber)
        user_pan_number = str(user_kyc_queryset.panNumber)

        if not user_mobile_number or not user_email or not user_pincode or not user_aadhar_number or not user_pan_number:
            data_status["result"] = "User Details Not Available"
            return data_status
        
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")
                
            ################################ SafeGold User Registration Api ########################################
            userRegisterResponseDict = safegold_registration(get_base_url,auth_token,userName,user_mobile_number,user_email,user_pincode)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] = "No Gold Provider Available"
            return data_status
        print("(((((((((((((userRegisterResponseDict gold register)))))))))))))",userRegisterResponseDict)
        responseStatus = userRegisterResponseDict.get("responseStatus")
        responseData = userRegisterResponseDict.get("responseData")
        message = userRegisterResponseDict.get("message")
        if responseStatus == 1:
            goldApiUserId = userRegisterResponseDict.get("user_id")
            gold_balance = userRegisterResponseDict.get("gold_balance",0)
            gold_users_queryset = GoldUsers(
                userId = userId,
                transactionApiId = transactionApiId, #####need confirmation
                apiReferenceId = str(goldApiUserId), ###3 userId from Api
                goldBalanceAmount = round(float(0),2),
                goldBalanceGrams = round(float(gold_balance),4), ###### put 4 digits after full stop
                sellGrams = round(float(0),4),
                sellAmount = round(float(0),2),
                mobileNumber = user_mobile_number,
                pinCode = user_pincode,
                email = user_email,
                kycVerify = False,
                aadharNumber = user_aadhar_number,
                panNumber = user_pan_number,
                status = 1,
                createdOn = datetime.datetime.now(),
                registrationResponseData=[responseData]
            )
            gold_users_queryset.save()

            finalResponseDict = {
                "goldApiUserId":goldApiUserId, ## should we send
            }
            
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
            return data_status
        else:
            data_status["result"]=message
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Register User. Please Try again"
        return data_status

def common_get_user_balance(transactionApiId,safeGoldUserId):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code
        
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")
                
            ################################ SafeGold User Registration Api ########################################
            getUserBalCommonResponseDict = safegold_balance_check(get_base_url,auth_token,safeGoldUserId)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status

        print("(((((((((((((getUserBalCommonResponseDict)))))))))))))",getUserBalCommonResponseDict)
        responseStatus = getUserBalCommonResponseDict.get("responseStatus")
        responseData = getUserBalCommonResponseDict.get("responseData")
        message = getUserBalCommonResponseDict.get("message")
        if responseStatus == 1:
            goldUserId = getUserBalCommonResponseDict.get("user_id")
            gold_balance = getUserBalCommonResponseDict.get("gold_balance")
            sellable_balance = getUserBalCommonResponseDict.get("sellable_balance")
            # gold_users_queryset = GoldUsers.objects(apiReferenceId=goldUserId).first()
            # gold_users_queryset.update(goldBalanceGrams=gold_balance)

            existing_user = GoldUsers.objects(
            apiReferenceId=str(goldUserId),
            ).first()

            if not existing_user:
                data_status["result"] = "Invalid Gold User Details"
                return data_status

            existing_user.update(goldBalanceGrams=round(float(gold_balance),4))
            existing_user.update(sellGrams=sellable_balance)

            existing_user_new = GoldUsers.objects(
            apiReferenceId=str(goldUserId),
            ).first()

            finalResponseDict = {
                "goldApiUserId":goldUserId,
                "goldBalance": existing_user_new.goldBalanceGrams,
                "sellableBalance": existing_user_new.sellGrams,
            }

            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message

        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Check User Gold Balance. Please Try again"
        return data_status

def common_fetch_invoice_details(transactionApiId, tx_id):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

                
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            fetchInvoiceResponseCommonDict = safegold_buy_invoice(get_base_url, auth_token,tx_id)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((fetchInvoiceResponseCommonDict ))))))))))",fetchInvoiceResponseCommonDict)
        
        responseStatus = fetchInvoiceResponseCommonDict.get("responseStatus")
        responseData = fetchInvoiceResponseCommonDict.get("responseData")
        message = fetchInvoiceResponseCommonDict.get("message")

        if responseStatus == 1:
            invoiceLink = fetchInvoiceResponseCommonDict.get("invoiceLink")

            finalResponseDict = {
                "invoiceLink":invoiceLink,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Fetch Invoice Details Please Try again"
        return data_status

#################################################    BUY APIS START  #################################################
def common_get_buy_price(transactionApiId):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")
                
            ################################ SafeGold User Registration Api ########################################
            getBuyPriceCommonResponseDict = safegold_get_buy_price(get_base_url,auth_token)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("(((((((((((((getBuyPriceCommonResponseDict)))))))))))))",getBuyPriceCommonResponseDict)
        responseStatus = getBuyPriceCommonResponseDict.get("responseStatus")
        responseData = getBuyPriceCommonResponseDict.get("responseData")
        message = getBuyPriceCommonResponseDict.get("message")
        if responseStatus == 1:
            current_price = getBuyPriceCommonResponseDict.get("current_price")
            rate_id = getBuyPriceCommonResponseDict.get("rate_id")
            applicable_tax = getBuyPriceCommonResponseDict.get("applicable_tax")
            rate_validity = getBuyPriceCommonResponseDict.get("rate_validity")

            finalResponseDict = {
                "current_price":current_price,
                "rate_id": rate_id,
                "applicable_tax": applicable_tax,
                "rate_validity": rate_validity,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Buy Price Balance. Please Try again"
        return data_status

def common_verify_buy_price(transactionApiId,safeGoldUserId, rateId, gold_amount,buy_price):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code
        
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold User Registration Api ########################################
            buyVerifyCommonResponseDict = safegold_buy_verify(get_base_url, auth_token,safeGoldUserId, rateId, gold_amount, buy_price)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((buyVerifyResponseDict ))))))))))",buyVerifyCommonResponseDict)
        
        responseStatus = buyVerifyCommonResponseDict.get("responseStatus")

        responseData = buyVerifyCommonResponseDict.get("responseData")
        requestData = buyVerifyCommonResponseDict.get("requestData")

        message = buyVerifyCommonResponseDict.get("message")

        if responseStatus == 1:
            transactionId = buyVerifyCommonResponseDict.get("tx_id")
            sgRate = buyVerifyCommonResponseDict.get("sg_rate")
            gold_amount = buyVerifyCommonResponseDict.get("gold_amount")
            buy_price = buyVerifyCommonResponseDict.get("buy_price")
            pre_gst_buy_price = buyVerifyCommonResponseDict.get("pre_gst_buy_price")
            gst_amount = buyVerifyCommonResponseDict.get("gst_amount")

            finalResponseDict = {
                "transactionId":transactionId,
                "sgRate": sgRate,
                "gold_amount": gold_amount,
                "buy_price": buy_price,
                "gst_amount": gst_amount,
                "pre_gst_buy_price": pre_gst_buy_price,
                # "transactionUniqueId": transactionUniqueId
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Verify Buy Gold. Please Try again"
        return data_status

def common_confirm_buy(transactionApiId,safeGoldUserId, tx_id, pincode):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status        

        transactionApiCode = transaction_apis_queryset.code

        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""
            date=datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            buyConfirmCommonResponseDict = safegold_buy_confirm(get_base_url, auth_token,safeGoldUserId, tx_id, pincode, date)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((buyConfirmCommonResponseDict ))))))))))",buyConfirmCommonResponseDict)
        
        responseStatus = buyConfirmCommonResponseDict.get("responseStatus")
        responseData = buyConfirmCommonResponseDict.get("responseData")
        message = buyConfirmCommonResponseDict.get("message")

        if responseStatus == 1:
            invoice_id = buyConfirmCommonResponseDict.get("invoice_id")

            gold_txn_queryset = GoldTransactions.objects(apiTransactionId=tx_id).first()

            if not gold_txn_queryset:
                data_status["result"] = "Invalid Transaction Id!!"
                return data_status

            finalResponseDict = {
                "message": "Gold Purchase Successful",
                "invoice_id":invoice_id,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Confirm Buy Please Try again"
        return data_status

def common_buy_status_check(transactionApiId, tx_id):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        
        transactionApiCode = transaction_apis_queryset.code

                
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            buyStatusCheckCommonResponseDict = safegold_buy_status_check(get_base_url, auth_token,tx_id)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((buyStatusCheckCommonResponseDict ))))))))))",buyStatusCheckCommonResponseDict)
        
        responseStatus = buyStatusCheckCommonResponseDict.get("responseStatus")
        responseData = buyStatusCheckCommonResponseDict.get("responseData")
        message = buyStatusCheckCommonResponseDict.get("message")

        if responseStatus == 1:
            invoice_id = buyStatusCheckCommonResponseDict.get("invoice_id")
            created_at = buyStatusCheckCommonResponseDict.get("created_at")
            status = buyStatusCheckCommonResponseDict.get("status")
            transactionStatus = buyStatusCheckCommonResponseDict.get("transactionStatus")

            gold_txn_queryset = GoldTransactions.objects(apiTransactionId=tx_id).first()

            if not gold_txn_queryset:
                data_status["result"] = "Invalid Transaction Id!!"
                return data_status


            finalResponseDict = {
                "invoice_id":invoice_id,
                "created_at":created_at,
                "status":status,
                "transactionStatus":transactionStatus,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status

#################################################    BUY APIS END    #################################################

#################################################    SELL APIS START #################################################
def common_get_sell_price(transactionApiId):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")
                
            ################################ SafeGold User Registration Api ########################################
            getBuyPriceCommonResponseDict = safegold_get_sell_price(get_base_url,auth_token)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("(((((((((((((getBuyPriceCommonResponseDict)))))))))))))",getBuyPriceCommonResponseDict)
        responseStatus = getBuyPriceCommonResponseDict.get("responseStatus")
        responseData = getBuyPriceCommonResponseDict.get("responseData")
        message = getBuyPriceCommonResponseDict.get("message")
        if responseStatus == 1:
            current_price = getBuyPriceCommonResponseDict.get("current_price")
            rate_id = getBuyPriceCommonResponseDict.get("rate_id")
            rate_validity = getBuyPriceCommonResponseDict.get("rate_validity")

            finalResponseDict = {
                "current_price":current_price,
                "rate_id": rate_id,
                "rate_validity": rate_validity,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Get Sell Price Balance. Please Try again"
        return data_status

def common_verify_sell_price(transactionApiId,safeGoldUserId, rateId, gold_amount,sell_price,channelType,userId,goldPrice,transactionUniqueId):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code
        
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold User Registration Api ########################################
            sellVerifyCommonResponseDict = safegold_sell_verify(get_base_url, auth_token,safeGoldUserId, rateId, gold_amount, sell_price)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((sellVerifyResponseDict ))))))))))",sellVerifyCommonResponseDict)
        
        responseStatus = sellVerifyCommonResponseDict.get("responseStatus")
        responseData = sellVerifyCommonResponseDict.get("responseData")
        requestData = sellVerifyCommonResponseDict.get("requestData")
        message = sellVerifyCommonResponseDict.get("message")

        if responseStatus == 1:
            transactionId = sellVerifyCommonResponseDict.get("tx_id")
            rate_id = sellVerifyCommonResponseDict.get("rate_id")
            sgRate = sellVerifyCommonResponseDict.get("rate")
            gold_amount = sellVerifyCommonResponseDict.get("gold_amount")
            sell_price = sellVerifyCommonResponseDict.get("sell_price")

            golduser_queryset = GoldUsers.objects(userId=userId,status__ne=2).first()

        
            gold_txns_queryset = GoldTransactions.objects(apiTransactionId=str(transactionId)).first()
        
            if gold_txns_queryset:
                data_status["result"] = "Duplicate Transaction Id!!"
                return data_status

            gold_txn_entry = GoldTransactions(
                goldTransactionType = "Debit", ### debit indicates gold debit
                goldTransactionApiId = transactionApiId,
                goldUserId = golduser_queryset.id,
                userId = userId,
                channelType = channelType,
                currentGoldPrice =  float(goldPrice),
                rateId = rateId,
                goldPurchaseAmount = float(sell_price),
                goldPurchaseGrams = float(gold_amount),
                purchaseGrandTotal = float(sell_price),
                chargesDict = [],
                paymentGatewayRequestBody = [],
                paymentGatewayResponseBody =  [],
                goldApiRequestData = requestData,
                goldApiResponseData = responseData,
                # paymentStatus = ,
                invoiceId="",
                transactionId = str(transactionUniqueId),
                statusCheckId = str(transactionId),
                apiTransactionId = str(transactionId),
                status=3, ###initiated
                createdOn =  datetime.datetime.now(),
            )

            gold_txn_entry.save()

            finalResponseDict = {
                "transactionId":transactionId,
                "rate_id": rate_id,
                "sgRate": sgRate,
                "gold_amount": gold_amount,
                "sell_price": sell_price,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Verify Sell Gold. Please Try again"
        return data_status

def common_confirm_sell(transactionApiId,safeGoldUserId, tx_id, pincode):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code
                
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""
            date=datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            sellConfirmCommonResponseDict = safegold_sell_confirm(get_base_url, auth_token,safeGoldUserId, tx_id, pincode, date)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status

        print("((((((((((sellConfirmCommonResponseDict ))))))))))",sellConfirmCommonResponseDict)

        responseStatus = sellConfirmCommonResponseDict.get("responseStatus")
        responseData = sellConfirmCommonResponseDict.get("responseData")
        message = sellConfirmCommonResponseDict.get("message")

        if responseStatus == 1:
            invoice_id = sellConfirmCommonResponseDict.get("invoice_id")

            gold_txn_queryset = GoldTransactions.objects(apiTransactionId=tx_id).first()

            if not gold_txn_queryset:
                data_status["result"] = "Invalid Transaction Id!!"
                return data_status
            # gold_txn_queryset.update(invoiceId=invoice_id) updating in frontend file

            finalResponseDict = {
                "message": "Gold Sell Successful",
                "invoice_id":invoice_id,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Confirm Sell Please Try again"
        return data_status

def common_sell_status_check(transactionApiId, tx_id):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

                
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            sellStatusCheckCommonResponseDict = safegold_sell_status_check(get_base_url, auth_token,tx_id)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((sellStatusCheckCommonResponseDict ))))))))))",sellStatusCheckCommonResponseDict)
        
        responseStatus = sellStatusCheckCommonResponseDict.get("responseStatus")
        responseData = sellStatusCheckCommonResponseDict.get("responseData")
        message = sellStatusCheckCommonResponseDict.get("message")

        if responseStatus == 1:
            invoice_id = sellStatusCheckCommonResponseDict.get("invoice_id")
            created_at = sellStatusCheckCommonResponseDict.get("created_at")
            status = sellStatusCheckCommonResponseDict.get("status")
            transactionStatus = sellStatusCheckCommonResponseDict.get("transactionStatus")

            gold_txn_queryset = GoldTransactions.objects(apiTransactionId=tx_id).first()

            if not gold_txn_queryset:
                data_status["result"] = "Invalid Transaction Id!!"
                return data_status
            
            finalResponseDict = {
                "invoice_id":invoice_id,
                "created_at":created_at,
                "status":status,
                "transactionStatus":transactionStatus,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status

def common_sell_make_payout(transactionApiId, tx_id):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

                
        # if transactionApiCode == "safegold":
        #     print("(((((((((((((Safe Gold Sell Status Check )))))))))))))")
        #     get_base_url = ""
        #     auth_token = ""

        #     for each_key in transaction_apis_queryset.paramsList:
        #         get_key = each_key.get("key")
        #         if get_key == "get_base_url":
        #             get_base_url = each_key.get("value")
        #         elif get_key == "auth_token":
        #             auth_token = each_key.get("value")

        #     ################################ SafeGold  Api ########################################
        #     sellStatusCheckCommonResponseDict = safegold_sell_status_check(get_base_url, auth_token,tx_id)
        #     ################################ SafeGold User Registration Api ########################################
        # else:
        #     data_status["result"] ="No Transaction Api Assigned!!"
        #     return data_status
        
        # print("((((((((((sellStatusCheckCommonResponseDict ))))))))))",sellStatusCheckCommonResponseDict)

        
        
        responseStatus = sellStatusCheckCommonResponseDict.get("responseStatus")
        responseData = sellStatusCheckCommonResponseDict.get("responseData")
        message = sellStatusCheckCommonResponseDict.get("message")

        if responseStatus == 1:
            invoice_id = sellStatusCheckCommonResponseDict.get("invoice_id")
            created_at = sellStatusCheckCommonResponseDict.get("created_at")
            status = sellStatusCheckCommonResponseDict.get("status")
            transactionStatus = sellStatusCheckCommonResponseDict.get("transactionStatus")

            gold_txn_queryset = GoldTransactions.objects(apiTransactionId=tx_id).first()

            if not gold_txn_queryset:
                data_status["result"] = "Invalid Transaction Id!!"
                return data_status
            
            finalResponseDict = {
                "invoice_id":invoice_id,
                "created_at":created_at,
                "status":status,
                "transactionStatus":transactionStatus,
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Perform Buy Status Check. Please Try again"
        return data_status

#################################################    SELL APIS END   #################################################

def common_user_kyc_update(userId,transactionApiId,safeGoldUserId):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:

        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code
        
        user_kyc_queryset = UserKYC.objects(userId=userId,status=1).first()
        if not user_kyc_queryset:
            data_status["result"]="Invalid merchant id!!"
            return data_status
        
        user_aadhar_number = str(user_kyc_queryset.aadharNumber)
        user_pan_number = str(user_kyc_queryset.panNumber)

        if not user_aadhar_number or not user_pan_number:
            data_status["result"] = "User Details Not Available"
            return data_status
        
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")
                
            ################################ SafeGold User Registration Api ########################################
            userKycUpdateResponseDict = safegold_kyc_update(get_base_url, auth_token, safeGoldUserId, user_pan_number, user_aadhar_number )
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("(((((((((((((userKycUpdateResponseDict gold register)))))))))))))",userKycUpdateResponseDict)
        responseStatus = userKycUpdateResponseDict.get("responseStatus")
        responseData = userKycUpdateResponseDict.get("responseData")
        message = userKycUpdateResponseDict.get("message")
        if responseStatus == 1:
            identity_required = userKycUpdateResponseDict.get("identity_required")
            pan_required = userKycUpdateResponseDict.get("pan_required")

            kycUpdatedStatus=False

            if identity_required == 1 and pan_required == 1:
                existing_user = GoldUsers.objects(
                apiReferenceId=str(safeGoldUserId),
                ).first()

                if not existing_user:
                    data_status["result"] = "Invalid Gold User Details"
                    return data_status

                existing_user.update(kycVerify=True)
                kycUpdatedStatus = True
                
            finalResponseDict = {
                "kycUpdatedStatus": kycUpdatedStatus
            }
            
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Update User KYC. Please Try again"
        return data_status

def common_historical_prices_interval(transactionApiId, from_date,to_date):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

                
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            historicalPricesIntervalResComDict = safegold_historical_prices_interval(get_base_url, auth_token, from_date, to_date)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((historicalPricesIntervalResComDict ))))))))))",historicalPricesIntervalResComDict)
        
        responseStatus = historicalPricesIntervalResComDict.get("responseStatus")
        responseData = historicalPricesIntervalResComDict.get("responseData")
        message = historicalPricesIntervalResComDict.get("message")

        if responseStatus == 1:
            finalResponseDict = {
                "pricesList":historicalPricesIntervalResComDict.get("pricesList"),
                "purity":historicalPricesIntervalResComDict.get("purity"),
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Fetch Invoice Details Please Try again"
        return data_status

def common_historical_prices(transactionApiId, from_date,to_date,priceFetchType):
    data_status = {"responseStatus": 0, "data": "","result":""}
    try:
        transaction_apis_queryset = TransactionAPI.objects(id=transactionApiId, status=1).first()
        
        if not transaction_apis_queryset:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        transactionApiCode = transaction_apis_queryset.code

        daysmapDict = { "day": "d", "week": "w","month": "m", "quarter": "q", "year": "y" }

        if priceFetchType in daysmapDict:
            pricetypeMapped = daysmapDict[priceFetchType]
        else:
            data_status["result"]="Invalid Fetch Type"
            return data_status
                
        if transactionApiCode == "safegold":
            get_base_url = ""
            auth_token = ""

            for each_key in transaction_apis_queryset.paramsList:
                get_key = each_key.get("key")
                if get_key == "get_base_url":
                    get_base_url = each_key.get("value")
                elif get_key == "auth_token":
                    auth_token = each_key.get("value")

            ################################ SafeGold  Api ########################################
            historicalPricesIntervalResComDict = safegold_historical_prices(get_base_url, auth_token, from_date, to_date, pricetypeMapped)
            ################################ SafeGold User Registration Api ########################################
        else:
            data_status["result"] ="No Transaction Api Assigned!!"
            return data_status
        
        print("((((((((((historicalPricesIntervalResComDict ))))))))))",historicalPricesIntervalResComDict)
        
        responseStatus = historicalPricesIntervalResComDict.get("responseStatus")
        responseData = historicalPricesIntervalResComDict.get("responseData")
        message = historicalPricesIntervalResComDict.get("message")

        if responseStatus == 1:
            finalResponseDict = {
                "pricesList":historicalPricesIntervalResComDict.get("pricesList"),
                "purity":historicalPricesIntervalResComDict.get("purity"),
            }
            data_status["responseStatus"] = 1
            data_status["result"] = message
            data_status["data"]= finalResponseDict
        else:
            data_status["result"]=message
        
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Fetch Invoice Details Please Try again"
        return data_status

def common_fetch_all_buy_prices():
    data_status = {"responseStatus": 0, "data": "","result":""}
    transactionDetailsList = []
    try:
        transaction_apis_queryset = TransactionAPI.objects(transactionType="Gold", status=1).all()
        
        if len(transaction_apis_queryset) <= 0:
            data_status["result"] = "Transaction API not found"
            return data_status
        
        for each_transaction_api in transaction_apis_queryset:
            transactionApiCode = each_transaction_api.code

            if transactionApiCode == "safegold":
                get_base_url = ""
                auth_token = ""

                for each_key in each_transaction_api.paramsList:
                    get_key = each_key.get("key")
                    if get_key == "get_base_url":
                        get_base_url = each_key.get("value")
                    elif get_key == "auth_token":
                        auth_token = each_key.get("value")
                    
                ################################ SafeGold User Registration Api #################
                # #######################
                getBuyPriceCommonResponseDict = safegold_get_buy_price(get_base_url,auth_token)
                ################################ SafeGold User Registration Api ########################################
            else:
                data_status["result"] ="No Transaction Api Assigned!!"
                return data_status
            
            responseStatus = getBuyPriceCommonResponseDict.get("responseStatus")
            responseData = getBuyPriceCommonResponseDict.get("responseData")
            message = getBuyPriceCommonResponseDict.get("message")
            if responseStatus == 1:
                current_price = getBuyPriceCommonResponseDict.get("current_price")
                rate_id = getBuyPriceCommonResponseDict.get("rate_id")
                applicable_tax = getBuyPriceCommonResponseDict.get("applicable_tax")
                rate_validity = getBuyPriceCommonResponseDict.get("rate_validity")

                each_txn_dict = {
                    "apiName": each_transaction_api.apiName,
                    "transactionApiId": str(each_transaction_api.id),
                    "current_price":current_price,
                    "rate_id": rate_id,
                    "applicable_tax": applicable_tax,
                    "rate_validity": rate_validity,
                }
                transactionDetailsList.append(each_txn_dict)
            else:
                # data_status["result"]=message
                print("Fetching all gold prcies errors data", message)
        if len(transactionDetailsList) > 0:
            data_status["responseStatus"] = 1
            data_status["result"] = "successfully Fetched Prices!!!"
            data_status["transactionDetailsList"] = transactionDetailsList
        else:
            data_status["responseStatus"]=0
            data_status["result"]= "Unable to Fetch Gold prices"
        return data_status
       
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable To Fetch All Buy Prices. Please Try again"
        return data_status
