from appservices.common.util import *

banks = Blueprint("banks",__name__)

#Add bank
@banks.route("/add_bank_or_UPI",methods=["POST"])
def add_bank_or_UPI():
    data_status = {"responseStatus": 0, "result": ""}
    userId = request.json.get("userId","")
    paymentMethod = request.json.get("paymentMethod","")
    accountHolderName = request.json.get("accountHolderName","")
    accountNumber = request.json.get("accountNumber","")
    accountType = request.json.get("accountType","")
    bankName = request.json.get("bankName","")
    ifscCode = request.json.get("ifscCode","")
    remarks = request.json.get("remarks","")
    upiId = request.json.get("upiId","")
    bankCheckImage = request.json.get("bankCheckImage","")

    if userId and paymentMethod in ["bank","UPI"]:
        user_queryset = Users.objects(id=userId,status__in=[1]).first()
        if not user_queryset:
            data_status["result"]="Invalid user"
            return data_status
        if paymentMethod == "bank":
            if accountHolderName and accountNumber and accountType and bankName and ifscCode:
                try:
                    bank_table = Banks(
                        userId = userId,
                        paymentMethod = paymentMethod,
                        accountHolderName  = accountHolderName,
                        accountNumber  = accountNumber,
                        accountType  = accountType, 
                        bankName = bankName,
                        ifscCode = ifscCode,
                        upiId = upiId,
                        remarks = remarks,
                        createdOn =datetime.datetime.now(),
                        status = 0
                        )
                    save_table = bank_table.save()
                    # bankId = str(save_table.id)

                    if bankCheckImage:
                        image = upload_file_image(bankCheckImage, "bankChecks", str(get_epoch_milli_time()), "")
                        if image:
                            bank_table.update(bankCheckImage=image)

                    data_status["responseStatus"] = 1
                    data_status["result"] = "New bank added successfully!"
                    return data_status

                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    data_status["result"] = "Unable to add bank!"
                    return data_status
            else:
                data_status["result"] = "Required fields are missing!!"
                return data_status

        elif paymentMethod == "UPI":
            if accountHolderName and upiId:
                try:
                    bank_table = Banks(
                        userId = userId,
                        paymentMethod = paymentMethod,
                        accountHolderName  = accountHolderName,
                        upiId = upiId,
                        remarks = remarks,
                        createdOn =datetime.datetime.now(),
                        status = 0
                        )
                    save_table = bank_table.save()
                    # bankId = str(save_table.id)

                    data_status["responseStatus"] = 1
                    data_status["result"] = "New UPI added successfully!"
                    return data_status

                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    data_status["result"] = "Unable to add UPI!"
                    return data_status
            else:
                data_status["result"] = "Required fields are missing!!"
                return data_status
    else:
        data_status["result"] = "Paymen method should be in UPI or bank!!"
        return data_status

def fetching_bank_details(bank_queryset):
    bank_dict = {}
    try:
        ist_time=bank_queryset.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
        bank_dict={
        "id":str(bank_queryset.id),
        "paymentMethod":bank_queryset.paymentMethod,
        "accountHolderName":bank_queryset.accountHolderName,
        "accountNumber":bank_queryset.accountNumber,
        "accountType":bank_queryset.accountType,
        "bankName":bank_queryset.bankName,
        "ifscCode":bank_queryset.ifscCode,
        "remarks":bank_queryset.remarks,
        "status":bank_queryset.status,
        "createdOn":ist_time.strftime("%d %b %I:%M %p"),
        }
        if bank_queryset.bankCheckImage:
            bank_dict["bankCheckImage"] = domain+bank_queryset.bankCheckImage
        else:
            bank_dict["bankCheckImage"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return bank_dict

def fetching_UPI_details(bank_queryset):
    upi_dict = {}
    try:
        ist_time=bank_queryset.createdOn.replace(tzinfo=pytz.utc).astimezone(ist_timezone)
        upi_dict={
        "id":str(bank_queryset.id),
        "paymentMethod":bank_queryset.paymentMethod,
        "accountHolderName":bank_queryset.accountHolderName,
        "upiId":bank_queryset.upiId,
        "remarks":bank_queryset.remarks,
        "status":bank_queryset.status,
        "createdOn":ist_time.strftime("%d %b %I:%M %p"),
        }
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return upi_dict

#Get bank details list API
@banks.route('/get_bank_details_list',methods=["POST","GET"])
def get_bank_details_list():
    data_status={"responseStatus":1,"result":""}
    userId = request.json.get("userId","")
    banksList = []
    UPIList = []

    if userId:
        try:
            banks_queryset = Banks.objects(
                userId=userId,
                paymentMethod="bank",
                status__in=[0]
                ).order_by('-id').all()
            for each_bank in banks_queryset:
                bank_data = fetching_bank_details(each_bank)
                banksList.append(bank_data)

            UPIs_queryset = Banks.objects(
                userId=userId,
                paymentMethod="UPI",
                status__in=[0]
                ).order_by('-id').all()

            for each_upi in UPIs_queryset:
                UPI_data = fetching_UPI_details(each_upi)
                UPIList.append(UPI_data)

            data_status["responseStatus"] = 1
            data_status["result"] = "Bank details fetched successfully"
            data_status["banksList"] = banksList
            data_status["UPIList"] = UPIList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "unable to fetch bank details"
            return data_status
    else:
        data_status["result"] = "Required fields are missing"
        return data_status

#Get bank details list API
@banks.route('/get_verfied_bank_details_list',methods=["POST","GET"])
def get_verfied_bank_details_list():
    data_status={"responseStatus":1,"result":""}
    userId = request.json.get("userId","")
    banksList = []
    UPIList = []

    if userId:
        try:
            banks_queryset = Banks.objects(
                userId=userId,
                paymentMethod="bank",
                status__in=[1]
                ).order_by('-id').all()
            for each_bank in banks_queryset:
                bank_data = fetching_bank_details(each_bank)
                banksList.append(bank_data)

            UPIs_queryset = Banks.objects(
                userId=userId,
                paymentMethod="UPI",
                status__in=[1]
                ).order_by('-id').all()

            for each_upi in UPIs_queryset:
                UPI_data = fetching_UPI_details(each_upi)
                UPIList.append(UPI_data)

            data_status["responseStatus"] = 1
            data_status["result"] = "Bank details fetched successfully"
            data_status["banksList"] = banksList
            data_status["UPIList"] = UPIList
            return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            data_status["result"] = "unable to fetch bank details"
            return data_status
    else:
        data_status["result"] = "Required fields are missing"
        return data_status


# #Add UPI
# @banks.route("/add_UPI",methods=["POST"])
# def add_UPI():
#     data_status = {"responseStatus": 0, "result": ""}
#     userId = request.json.get("userId","")
#     paymentMethod = request.json.get("paymentMethod","")
#     accountHolderName = request.json.get("accountHolderName","")
#     upiId = request.json.get("upiId","")
#     remarks = request.json.get("remarks","")

#     if userId and paymentMethod and accountHolderName and upiId:
#         try:
#             user_queryset = Users.objects(id=userId,status__in=[1]).first()
#             if not user_queryset:
#                 data_status["result"]="Invalid user"
#                 return data_status
#             bank_table = Banks(
#                 userId = userId,
#                 paymentMethod = paymentMethod,
#                 accountHolderName  = accountHolderName, 
#                 upiId = upiId,
#                 remarks = remarks,
#                 createdOn =datetime.datetime.now(),
#                 status = 0
#                 )
#             save_table = bank_table.save()
#             bankId = str(save_table.id)

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





# #Get banks list API
# @banks.route('/get_UPI_list',methods=["POST","GET"])
# def get_UPI_list():
#     data_status={"responseStatus":1,"result":""}
#     userId = request.json.get("userId","")
#     UPIList = []

#     if userId:
#         try:

#             banks_queryset = Banks.objects(
#                 userId=userId,
#                 paymentMethod="upi",
#                 status__in=[1]
#                 ).order_by('-id').all()

#             for each_upi in banks_queryset:
#                 UPI_data = fetching_UPI_details(each_upi)
#                 UPIList.append(UPI_data)
#             data_status["responseStatus"] = 1
#             data_status["result"] = "UPI details fetched successfully"
#             data_status["banksList"] = banksList
#             return data_status
#         except Exception as e:
#             app.logger.error(traceback.format_exc())
#             data_status["result"] = "unable to fetch UPI details"
#             return data_status
#     else:
#         data_status["result"] = "Required fields are missing"
#         return data_status

#Add Wallet to Bank Settlement
@banks.route("/wallet_to_bank_settlement",methods=["POST"])
def wallet_to_bank_settlement():
    data_status = {"responseStatus": 0, "result": ""}
    paymentMethod = request.json.get("paymentMethod","")
    userId = request.json.get("userId","")
    bankId = request.json.get("bankId","")
    paymentMode = request.json.get("paymentMode","")
    amount = request.json.get("amount")
    upiId = request.json.get("upiId","")
    remarks = request.json.get("remarks","")

    if userId and paymentMethod in ["bank","UPI"]:
        user_queryset = Users.objects(id=userId,status__in=[1]).first()
        if not user_queryset:
            data_status["result"]="Invalid user"
            return data_status
        if paymentMethod == "bank":
            userWalletBalance = float(user_queryset.walletBalance)
            if not userWalletBalance >= float(amount):
                data_status["result"]="In-sufficient wallet balance!!"
                return data_status
            if bankId and paymentMode and amount:
                try:
                    wallet_to_bank_table = WalletToBank(
                        userId = userId,
                        bankId = bankId,
                        paymentMethod = paymentMethod,
                        paymentMode  = paymentMode,
                        amount  = amount,
                        remarks  = remarks,
                        createdOn =datetime.datetime.now(),
                        status = 0 # 0 for pending, 1 for success, 2 for failed
                        )
                    save_table = wallet_to_bank_table.save()

                    # transactionUniqueId = "TXN"+random_digit_generate(16)

                    # #Amount Debiting from User Wallet
                    # user_queryset.walletBalance = userWalletBalance - float(amount)
                    # user_queryset.save()

                    # #Add a record in wallet transaction table
                    # wallet_transaction_tablle = WalletTransaction(
                    #     userId = userId,
                    #     amount =amount,
                    #     paymentType =paymentMode,
                    #     creditType ="debit",
                    #     transactionId =transactionUniqueId,
                    #     userType ="user",
                    #     createdOn =datetime.datetime.now(),
                    #     status = 1, # 0 for pending, 1 for success, 2 for failed
                    #     )

                    data_status["responseStatus"] = 1
                    data_status["result"] = str(int(amount))+" rupees added to your bank successfully!"
                    return data_status

                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    data_status["result"] = "Unable to add money to the bank!"
                    return data_status
            else:
                data_status["result"] = "Required fields are missing"
                return data_status

        elif paymentMethod == "UPI":
            if upiId and paymentMode and amount:
                try:
                    wallet_to_bank_table = WalletToBank(
                        userId = userId,
                        upiId = upiId,
                        paymentMethod = paymentMethod,
                        paymentMode  = paymentMode,
                        amount  = amount,
                        remarks  = remarks,
                        createdOn =datetime.datetime.now(),
                        status = 0
                        )
                    save_table = wallet_to_bank_table.save()

                    data_status["responseStatus"] = 1
                    data_status["result"] = str(int(amount))+" rupees added to your UPI successfully!"
                    return data_status

                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    data_status["result"] = "Unable to add money to UPI!"
                    return data_status
            else:
                data_status["result"] = "Required fields are missing"
                return data_status
    else:
        data_status["result"] = "Paymen method should be in UPI or bank!!"
        return data_status
