from appservices.common.util import *

dmt_transactions = Blueprint("dmt_transactions",__name__)

csrf.exempt(dmt_transactions)

@dmt_transactions.route("/remitter_registration",methods=["POST"])
@encrypt_decrypt_after_login
def remitter_registration():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
        firstName = data.get("firstName","")
        lastName = data.get("lastName","")
        phoneNumber = data.get("phoneNumber","")
        pincode = data.get("pincode") 
        moneyArtRemitterId = data.get("moneyArtRemitterId")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    if userId and firstName and lastName and phoneNumber and pincode:
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status

            remitter_queryset = Remitters.objects(phoneNumber__iexact=phoneNumber,status__in=[1]).first()
            if remitter_queryset:
                data_status["result"]="This mobile number is already in use!!"
                return data_status
            remitter_table = Remitters(
                userId=userId,
                firstName = firstName,
                lastName  = lastName,
                phoneNumber  = phoneNumber,
                pincode = pincode,
                moneyArtRemitterId = moneyArtRemitterId,
                monthlyLimit=25000.00,
                availableBalance=25000.00,
                createdOn =datetime.datetime.now(),
                status = 1
                )
            save_table = remitter_table.save()
            remitterId = str(save_table.id)

            data_status["responseStatus"] = 1
            data_status["result"] = "Remitter registration successfully!"
            data_status["remitterId"]=remitterId
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to complete remitter registration!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@dmt_transactions.route("/check_remitter_mobile_number",methods=["POST"])
@encrypt_decrypt_after_login
def check_remitter_mobile_number():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        phoneNumber = data.get("phoneNumber","")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    
    if phoneNumber:
        try:
            remitter_queryset = Remitters.objects(phoneNumber__iexact=phoneNumber,status__in=[1]).first()
            if remitter_queryset:
                data_status["responseStatus"] = 2
                data_status["result"]="This mobile number is already in use!!"
                remittersData={
                'remitterId':str(remitter_queryset.id),
                # 'moneyArtRemitterId':str(remitter_queryset.moneyArtRemitterId),
                'phoneNumber':remitter_queryset.phoneNumber,
                'firstName':remitter_queryset.firstName,
                'lastName':remitter_queryset.lastName,
                'availableBalance':remitter_queryset.availableBalance,
                'monthlyLimit':remitter_queryset.monthlyLimit,
                }
                if remitter_queryset.moneyArtRemitterId:
                    remittersData["moneyArtRemitterId"] = remitter_queryset.moneyArtRemitterId
                else:
                    remittersData["moneyArtRemitterId"] = ""
                data_status["remittersData"]=remittersData
                return data_status
            else:
                data_status["responseStatus"] = 1
                data_status["remitterId"] = ""
                data_status["result"] = "This number is available for remitter registration!!"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["responseStatus"]=0
            data_status["result"]="Unable to check remitter data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status



@dmt_transactions.route("/remitters_list",methods=["POST"])
@encrypt_decrypt_after_login
def remitters_list():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
        remittersList=[]
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if not userId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        user_queryset = Users.objects(id=userId,status__in=[1]).first()
        if not user_queryset:
            data_status["result"]="Invalid user id!!"
            return data_status
        remitters_queryset = Remitters.objects(userId=userId,status__in=[1]).order_by("-id").all()
        
        for each_remitter in remitters_queryset:
            remitterDict = {
            "id":str(each_remitter.id),
            "userId":str(each_remitter.userId.id),
            "userName":each_remitter.userId.fullName,
            "firstName":each_remitter.firstName,
            "lastName":each_remitter.lastName,
            "pincode":each_remitter.pincode,
            "phoneNumber":each_remitter.phoneNumber
            }
            remittersList.append(remitterDict)
        data_status["responseStatus"] = 1
        data_status["result"] = "Remitters data fetched successfull!"
        data_status["remittersList"] = remittersList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch remitters data!!"
        return data_status


@dmt_transactions.route("/master_ifsc_banks_list",methods=["POST"])
@encrypt_decrypt_after_login
def master_ifsc_banks_list():
    data_status = {"responseStatus": 0, "result": ""}
    banksList=[]
    try:
        master_banks_queryset = MasterIFSCBank.objects(status__in=[1]).order_by("-id").all()
        
        for each_bank in master_banks_queryset:
            bankDict = {
            "id":str(each_bank.id),
            "bankName":each_bank.bankName,
            "ifscCode":each_bank.ifscCode
            # "bankCode":each_bank.bankCode
            }
            if each_bank.image:
                bankDict["image"]=domain+each_bank.image
            else:
                bankDict["image"]=""
            banksList.append(bankDict)
        data_status["responseStatus"] = 1
        data_status["result"] = "Banks data fetched successfull!"
        data_status["banksList"] = banksList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch banks data!!"
        return data_status

@dmt_transactions.route("/add_beneficiary",methods=["POST"])
@encrypt_decrypt_after_login
def add_beneficiary():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
        masterBankId = data.get("masterBankId","")
        remitterId = data.get("remitterId","")
        verifyStatus = data.get("verifyStatus",False)
        accountNumber = data.get("accountNumber",0)
        mobileNumber = data.get("mobileNumber","")
        fullName = data.get("fullName","")
        beneficiaryId = data.get("beneficiaryId","")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    if userId and masterBankId :
        try:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            master_bank_queryset = MasterIFSCBank.objects(id=masterBankId,status__in=[1]).first()
            if not master_bank_queryset:
                data_status["result"]="Invalid master bank id!!"
                return data_status
            beneficiary_table = Beneficiaries(
                userId=userId,
                masterBankId = masterBankId,
                remitterId = remitterId,
                verifyStatus  = verifyStatus,
                mobileNumber  = mobileNumber,
                accountNumber  = accountNumber,
                beneficiaryId  = beneficiaryId,
                fullName  = fullName,
                createdOn =datetime.datetime.now(),
                status = 1
                )
            save_table = beneficiary_table.save()

            data_status["responseStatus"] = 1
            data_status["result"] = "Beneficiary added successfully!"
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "Unable to save beneficiary data!!"
            return data_status
    else:
        data_status["result"] = "Required fields are missing!!"
        return data_status

@dmt_transactions.route("/beneficiaries_list",methods=["POST"])
@encrypt_decrypt_after_login
def beneficiaries_list():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        remitterId = data.get("remitterId","")
        beneficiariesList=[]
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    
    try:
        if not remitterId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        beneficiaries_queryset = Beneficiaries.objects(remitterId=remitterId,status__in=[1]).order_by("-id").all()
        
        for each_beneficary in beneficiaries_queryset:
            beneficiaryDict = {
            "id":str(each_beneficary.id),
            "masterBankId":str(each_beneficary.masterBankId.id),
            "masterBankName":each_beneficary.masterBankId.bankName,
            "masterBankCode":each_beneficary.masterBankId.bankCode,
            "masterBankIfscCode":each_beneficary.masterBankId.ifscCode,
            # "userId":str(each_beneficary.userId.id),
            # "userName":each_beneficary.userId.fullName,
            "fullName":each_beneficary.fullName,
            "accountNumber":each_beneficary.accountNumber,
            "beneficiaryId":each_beneficary.beneficiaryId,
            "verifyStatus":each_beneficary.verifyStatus
            }
            if each_beneficary.mobileNumber:
                beneficiaryDict["mobileNumber"]=each_beneficary.mobileNumber
            else:
                beneficiaryDict["mobileNumber"]=""
                
            beneficiariesList.append(beneficiaryDict)
        data_status["responseStatus"] = 1
        data_status["result"] = "Beneficiaries data fetched successfull!"
        data_status["beneficiariesList"] = beneficiariesList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch beneficiaries data!!"
        return data_status

@dmt_transactions.route("/delete_beneficiary",methods=["POST"])
@encrypt_decrypt_after_login
def delete_beneficiary():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
        beneficiaryId = data.get("beneficiaryId","")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    
    try:
        if beneficiaryId and userId:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status
            beneficiary_queryset = Beneficiaries.objects(userId=userId,beneficiaryId=beneficiaryId,status__in=[1]).first()
            if not beneficiary_queryset:
                data_status["result"]="Invalid beneficiary id!!"
                return data_status
            beneficiary_queryset.update(status=2)

            data_status["responseStatus"] = 1
            data_status["result"] = "Beneficiary deleted successfully!"
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to delete beneficiary data!!"
        return data_status

@dmt_transactions.route("/user_available_balance",methods=["POST"])
@encrypt_decrypt_after_login
def user_available_balance():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    
    try:
        if userId:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status

            data_status["responseStatus"] = 1
            data_status["result"] = "User balance fetched successfully!"
            data_status["userAvailableBalance"]=user_queryset.walletBalance
            data_status["commissionBalance"]=user_queryset.commissionBalance
            return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch user balance data!!"
        return data_status


@dmt_transactions.route("/money_transfer",methods=["POST"])
@encrypt_decrypt_after_login
def money_transfer():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
        beneficiaryId = data.get("beneficiaryId","")
        remitterId = data.get("remitterId","")
        categoryName = data.get("categoryName","")
        serviceName = data.get("serviceName","")
        operatorName = data.get("operatorName","")
        operatorReference = data.get("operatorReference","")
        mobileNumber = data.get("mobileNumber","")
        transactionData = data.get("transactionData")
        amount = data.get("amount",0)
        paymentType = data.get("paymentType","") #"IMPS","NEFT","Wallet"
        # transferType = request.json.get("transferType","DMT") #"wallet","recharge","DMT"
        transactionUniqueId = "TXN"+random_digit_generate(16)

        transactionData = [transactionData]
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status
    
    try:
        if userId and beneficiaryId and amount and paymentType:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status

            beneficiary_queryset = Beneficiaries.objects(beneficiaryId=beneficiaryId,status__in=[1]).first()
            if not beneficiary_queryset:
                data_status["result"]="Invalid beneficiary id!!"
                return data_status

            userBalance = float(user_queryset.walletBalance)
            if userBalance >= float(amount):
                accountNumber = beneficiary_queryset.accountNumber

                transaction_table = Transactions(
                    userId=userId,
                    # beneficiaryId = beneficiaryId,
                    beneficiaryId = str(beneficiary_queryset.id),
                    remitterId=remitterId,
                    categoryName = categoryName,
                    serviceName = serviceName,
                    amount  = amount,
                    paymentType  = paymentType,
                    operatorName  = operatorName,
                    operatorReference  = operatorReference,
                    transactionId = transactionUniqueId,
                    transactionData = transactionData,
                    mobileNumber = mobileNumber,
                    createdOn =datetime.datetime.now(),
                    status = 1
                    )
                save_transaction_table = transaction_table.save()
                transactionTableId = str(save_transaction_table.id)
                if save_transaction_table:
                    save_transaction_table.update(paymentGatewayId=None,operatorId=None,serviceId=None,categoryId=None)

                if save_transaction_table:
                    wallet_transaction_table = WalletTransactions(
                        userId=userId,
                        transactionData = [],
                        amount  = amount,
                        creditType = "debit",
                        paymentType  = paymentType,
                        transactionId = transactionUniqueId,
                        userType = "user",
                        walletLog = serviceName + " " + str(accountNumber) + " is transferred with the amount of " + str(int(amount)) + ".",
                        createdOn =datetime.datetime.now(),
                        status = 1
                        )
                    save_table = wallet_transaction_table.save()
                    if save_table:
                        save_table.update(createdBy = None,settlementPayId = None,paymentGatewayId = None)

                    userUpdateBalance = float(user_queryset.walletBalance) - float(amount)
                    user_queryset.update(walletBalance= userUpdateBalance )

                data_status["responseStatus"] = 1
                data_status["id"] = transactionTableId
                data_status["result"] = "Money successfully transferred!"
                return data_status
            else:
                data_status["result"]="User balance is in-sufficient!!"
                return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to transfer money data!!"
        return data_status

@dmt_transactions.route("/payout_transfer",methods=["POST"])
@encrypt_decrypt_after_login
def payout_transfer():
    data_status = {"responseStatus": 0, "result": ""}
    try:
        data = request.decrypted_data
        userId = data.get("userId","")
        # remitterId = request.json.get("remitterId","")
        categoryId = data.get("categoryId",None)
        serviceId = data.get("serviceId",None)
        operatorId = data.get("operatorId",None)
        categoryName = data.get("categoryName","")
        serviceName = data.get("serviceName","")
        operatorName = data.get("operatorName","")
        operatorReference = data.get("operatorReference","")
        mobileNumber = data.get("mobileNumber","")
        ifscCode = data.get("ifscCode","")
        accountNumber = data.get("accountNumber","")
        accountHolderName = data.get("accountHolderName","")
        transactionData = data.get("transactionData")
        amount = data.get("amount",0)
        status = data.get("status")
        paymentType = data.get("paymentType","") #"IMPS","NEFT","Wallet"
        transactionUniqueId = "TXN"+random_digit_generate(16)
        transactionData = [transactionData] 
        print(data)
        print("(((((((((((((((((request.json)))))))))))))))))")
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Invalid Request"
        return data_status

    try:
        if userId and amount and paymentType:
            user_queryset = Users.objects(id=userId,status__in=[1]).first()
            if not user_queryset:
                data_status["result"]="Invalid user id!!"
                return data_status

            userBalance = float(user_queryset.walletBalance)
            if userBalance >= float(amount):
                transaction_table = Transactions(
                    userId=userId,
                    # remitterId=remitterId,
                    categoryId=categoryId,
                    serviceId=serviceId,
                    operatorId=operatorId,
                    categoryName = categoryName,
                    # paymentGatewayId = paymentGatewayId,
                    serviceName = serviceName,
                    amount  = amount,
                    paymentType  = paymentType,
                    operatorName  = operatorName,
                    operatorReference  = operatorReference,
                    transactionId = transactionUniqueId,
                    mobileNumber = mobileNumber,
                    ifscCode = ifscCode,
                    accountNumber = accountNumber,
                    transactionData = transactionData,
                    accountHolderName = accountHolderName,
                    createdOn =datetime.datetime.now(),
                    status = status
                    )
                save_transaction_table = transaction_table.save()
                transactionTableId = str(save_transaction_table.id)
                if save_transaction_table:
                    save_transaction_table.update(paymentGatewayId=None)

                if save_transaction_table:
                    wallet_transaction_table = WalletTransactions(
                        userId=userId,
                        transactionData = [],
                        amount  = amount,
                        creditType = "debit",
                        paymentType  = paymentType,
                        transactionId = transactionUniqueId,
                        userType = "user",
                        walletLog = serviceName + " " + str(accountNumber) + " is transferred with the amount of " + str(int(amount)) + ".",
                        createdOn =datetime.datetime.now(),
                        status = status
                        )
                    save_table = wallet_transaction_table.save()
                    if save_table:
                        save_table.update(createdBy = None,settlementPayId = None,paymentGatewayId = None)

                    userUpdateBalance = float(user_queryset.walletBalance) - float(amount)
                    user_queryset.update(walletBalance= userUpdateBalance )

                data_status["responseStatus"] = 1
                data_status["id"] = transactionTableId
                data_status["result"] = "Money successfully transferred!"
                return data_status
            else:
                data_status["result"]="User balance is in-sufficient!!"
                return data_status
        else:
            data_status["result"]="Required fields are missing!!"
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to transfer money data!!"
        return data_status