import math
from appservices.common.util import *
from appservices.common.form_schemas import *

charge_backs = Blueprint("charge_backs",__name__)

def fetching_chargeback_common_transaction_details(chargeBackType,each_record):
    dataDict={}
    try:
        print("each_record.id",each_record.id)
        dataDict = {
            "id": each_record.id,
            "transactionId": each_record.transactionId,
            # "status": each_record.status,
            "customerName": each_record.customerName,
            "merchantName": each_record.userId.fullName,
            "merchantEmail": each_record.userId.email,
            # "previousBalance": each_record.previousBalance,
            # "currentBalance": each_record.currentBalance,
            # "paymentMode": each_record.paymentMode,
            # "orderId": each_record.orderId,
            "paymentType": each_record.paymentType,
            # "creditType": each_record.creditType,
            "createdOn": each_record.createdOn.strftime("%d-%m-%Y %I:%M %p"),
            # "responseCallBackTime": each_record.responseCallBackTime,
            "commissionCharges": each_record.commissionCharges,
            # "amount": each_record.amount,
            # "grandTotal": each_record.grandTotal,
            # "narration": each_record.narration,
            "errorMessage": each_record.errorMessage
        }
        if each_record.status == 1:
            dataDict["status"] = "Success"
        elif each_record.status == 2:
            dataDict["status"] = "Processing"
        elif each_record.status == 4:
            dataDict["status"] = "Reversal"
        elif each_record.status == 5:
            dataDict["status"] = "Refund"
        elif each_record.status == 3:
            dataDict["status"] = "Initiated"
        else:
            dataDict["status"] = "Failed"


        if chargeBackType == "wallet":
            dataDict["transactionId"] = each_record.pgOrderId
            dataDict["grandTotal"] = each_record.grandTotal
            dataDict["amount"] = each_record.amount
            dataDict["cardmasked"] = mask_account_number(each_record.cardmasked)
            
        if chargeBackType == "digital_gold":
            dataDict["amount"] = each_record.paymentAmount
            dataDict["grandTotal"] = each_record.paymentGrandTotal
            dataDict["cardmasked"] = mask_account_number(each_record.cardmasked)

        if chargeBackType == "utility":
            dataDict["grandTotal"] = each_record.totalAmount
            dataDict["amount"] = each_record.amount
            dataDict["merchantName"] = each_record.userId.fullName
            dataDict["cardmasked"] = mask_account_number(each_record.cardNumber)

        try:
            if each_record.creditType:
                dataDict["creditType"] = each_record.creditType
            else:
                dataDict["creditType"] = ""
        except Exception as e:
            
                dataDict["creditType"] = ""
        
        try:
            if each_record.responseCallBackTime:
                dataDict["responseCallBackTime"] = each_record.responseCallBackTime.strftime("%d-%m-%Y %I:%M %p")
            else:
                dataDict["responseCallBackTime"] = ""
        except Exception as e:
            
                dataDict["responseCallBackTime"] = ""

        try:
            if each_record.orderId:
                dataDict["orderId"] = each_record.orderId
            else:
                dataDict["orderId"] = ""
        except Exception as e:
            
                dataDict["orderId"] = ""
                
        try:
            if each_record.customerPhonenumber:
                dataDict["customerPhonenumber"] = each_record.customerPhonenumber
            else:
                dataDict["customerPhonenumber"] = ""
        except Exception as e:
            
                dataDict["customerPhonenumber"] = ""
        try:
            if each_record.previousBalance:
                dataDict["previousBalance"] = each_record.previousBalance
            else:
                dataDict["previousBalance"] = "N/A"
        except Exception as e:
            
                dataDict["previousBalance"] = "N/A"
        try:
            if each_record.currentBalance:
                dataDict["currentBalance"] = each_record.currentBalance
            else:
                dataDict["currentBalance"] = "N/A"
        except Exception as e:
            
                dataDict["currentBalance"] = "N/A"

        try:
            if each_record.paymentModeId:
                dataDict["paymentMode"] = each_record.paymentModeId.paymentMode
            else:
                dataDict["paymentMode"] = ""
        except Exception as e:
            
                dataDict["paymentMode"] = ""

        try:
            if each_record.customerEmail:
                dataDict["customerEmail"] = each_record.customerEmail
            else:
                dataDict["customerEmail"] = ""
        except Exception as e:
            
                dataDict["customerEmail"] = ""

        # try:
        #     if each_record.merchantName:
        #         dataDict["merchantName"] = each_record.merchantName
        #     else:
        #         dataDict["merchantName"] = ""
        # except Exception as e:
        #         dataDict["merchantName"] = ""

        # try:
        #     if each_record.merchantEmail:
        #         dataDict["merchantEmail"] = each_record.merchantEmail
        #     else:
        #         dataDict["merchantEmail"] = ""
        # except Exception as e:
        #         dataDict["merchantEmail"] = ""

        try:
            if each_record.platform:
                dataDict["platform"] = each_record.platform
            else:
                dataDict["platform"] = ""
        except Exception as e:
            
                dataDict["platform"] = ""

        try:
            if each_record.bankRefId:
                dataDict["bankRefId"] = each_record.bankRefId
            else:
                dataDict["bankRefId"] = ""
        except Exception as e:
            
                dataDict["bankRefId"] = ""

        try:
            if each_record.cardType:
                dataDict["cardType"] = each_record.cardType
            else:
                dataDict["cardType"] = ""
        except Exception as e:
            
                dataDict["cardType"] = ""
        try:
            if each_record.narration:
                dataDict["narration"] = each_record.narration
            else:
                dataDict["narration"] = ""
        except Exception as e:
            
                dataDict["narration"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return dataDict

@charge_backs.route("/get_charge_backs_list",methods=["POST","GET"])
@adminid_access_token_required
def get_charge_backs_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    csrf_token = request.form.get("csrf_token")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    userAgent=""
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr
    actionDate=datetime.datetime.now()

    total_count=0
    pagination=None
    chargeBacksList=[]
    snoCount=0
    chargeBacksPage=None
    permissionsList = check_permissions(session.get("adminId"),"chargeBackPermissions")
    if "view" in permissionsList:
        try:

            chargeBacksPage = request.args.get(get_page_parameter("chargeBacksPage"), type=int, default=1)
            per_page = 20
            start = (chargeBacksPage - 1) * per_page
            total_count=0

            data = request.form.to_dict()

            pagination = Pagination(chargeBacksPage=chargeBacksPage, total=total_count, per_page=per_page,page_parameter ="chargeBacksPage", alignment="right", record_name="documents")

            charge_backs_queryset = (
                        ChargeBacks.objects()
                        .order_by("-id")
                        .skip(start)
                        .limit(per_page)
                    )
            for each_chargeback in charge_backs_queryset:
                chargebackDict = {
                    "id": each_chargeback.id,
                    "userId": each_chargeback.userId.fullName,
                    "walletTransactionId": each_chargeback.walletTransactionId,
                    "goldTransactionId": each_chargeback.goldTransactionId,
                    "transactionsWalletId": each_chargeback.transactionsWalletId,
                    "transactionId": each_chargeback.transactionId,
                    "transactionReferenceType": each_chargeback.transactionReferenceType,
                    "chargebackUtr": each_chargeback.chargebackUtr,
                    "pgOrderId": each_chargeback.pgOrderId,
                    "amount": each_chargeback.amount,
                    "reason": each_chargeback.reason,
                    "chargeBackRaisedDate": each_chargeback.chargeBackRaisedDate.strftime("%d-%m-%Y %I:%M %p"),
                    "createdOn": each_chargeback.createdOn.strftime("%d-%m-%Y %I:%M %p"),
                    "status": each_chargeback.status,
                }
                if each_chargeback.status == 1:
                    chargebackDict["actionText"] = "Amount Credit to Customer/ Customer favour and capped"
                elif each_chargeback.status == 2:
                    chargebackDict["actionText"] = "Recovered from Agents"
                elif each_chargeback.status == 3:
                    chargebackDict["actionText"] = "Initiated"
                elif each_chargeback.status == 4:
                    chargebackDict["actionText"] = "Customer favour without agent debit"
                elif each_chargeback.status == 5:
                    chargebackDict["actionText"] = "Customer favour with technical issue"
                elif each_chargeback.status == 0:
                    chargebackDict["actionText"] = "Chargeback reversal"
                else:
                    chargebackDict["actionText"] = "Unknown Status"
                chargeBacksList.append(chargebackDict)

            return render_template("super_admin_templates/get_charge_backs_list.html",
                    pagination=pagination,
                    chargeBacksList=chargeBacksList,
                    snoCount=snoCount,
                    chargeBacksPage = chargeBacksPage)
            
               
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "An error occurred while Charge Backs List"
            return render_template("super_admin_templates/get_charge_backs_list.html",
                    error = error,
                    pagination = pagination,
                    chargeBacksList = chargeBacksList,
                    snoCount = snoCount,
                    chargeBacksPage = chargeBacksPage
                    )
    else:
        flash("The staff member does not have permission to view Charge Backs List.", "danger")
        return redirect(url_for("admin.dashboard"))
       

@charge_backs.route("/get_charge_back_data_by_orderId", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def get_charge_back_data_by_orderId():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session expired.Please login again.","danger")
        data_status["responseStatus"]=4
        return data_status
    adminId = session.get("adminId")
    csrf_token = request.form.get("csrf_token")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr
    actionDate=datetime.datetime.now()
    form = ChargeBackFetchForm(request.args)
    chargeBackCreateDataList=[]
    try:
        permissionsList = check_permissions(session.get("adminId"),"chargeBackPermissions")
        if "add" in permissionsList:

            # print(" in add on demand")
            if request.method == "GET":

                pgOrderId = request.args.get("pgOrderId","")
                chargeBackType = request.args.get("chargeBackType")

                transactions_queryset=None

                if form.validate():
                # print(" in get route charge back report")
                    if chargeBackType == "wallet":
                        # print("no data found wallet")
                        transactions_queryset = WalletTransactions.objects(pgOrderId=pgOrderId,creditType="Credit").all()
                    elif chargeBackType == "utility":
                        # print("no data found utility")
                        transactions_queryset = Transactions.objects(transactionId=pgOrderId).all()
                    elif chargeBackType == "digital_gold":
                        # print("no data found digital_gold")
                        transactions_queryset = GoldTransactions.objects(transactionId=pgOrderId).all()
                    elif chargeBackType == "all":
                        # print("no data found all")
                        wallet_transactions_queryset = WalletTransactions.objects(pgOrderId=pgOrderId,creditType="Credit").all()
                        if len(wallet_transactions_queryset) > 0:
                            chargeBackType = "wallet"
                            print("chargeBackType",chargeBackType)
                            transactions_queryset = wallet_transactions_queryset
                        gold_transactions_queryset = GoldTransactions.objects(transactionId=pgOrderId).all()
                        if len(gold_transactions_queryset) > 0:
                            chargeBackType = "digital_gold"
                            print("chargeBackType",chargeBackType)
                            transactions_queryset = gold_transactions_queryset
                        utility_transactions_queryset = Transactions.objects(transactionId=pgOrderId).all()
                        if len(utility_transactions_queryset) > 0:
                            chargeBackType = "utility"
                            print("chargeBackType",chargeBackType)
                            transactions_queryset = utility_transactions_queryset
                    else:
                        # print("Invalid Type or PgOrder Id")
                        flash("Invalid Type or PgOrder Id","danger")
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                    try:
                        if transactions_queryset == None:
                            flash("Invalid Type or PgOrder Id","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))
                        counter = 0
                        print("chargeBackType",chargeBackType)
                        for each_record in transactions_queryset:
                            counter+=1
                            chargebackDataDict = fetching_chargeback_common_transaction_details(chargeBackType,each_record)
                            print("chargebackDataDict",chargebackDataDict)
                            chargeBackCreateDataList.append(chargebackDataDict)
                        print("total records matched for charge back ",counter)
                        return render_template("super_admin_templates/create_charge_back.html",
                                        form=form,
                                        chargeBackCreateDataList=chargeBackCreateDataList,
                                        chargeBackType=chargeBackType,
                                            )
                    except Exception as e:
                        flash("Unable to save Charge back.", "danger")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                else:
                    print("form errors", form.errors)
                    for field_name, error_list in form.errors.items():
                        for error in error_list:
                            flash(f"{field_name} {error}", "danger")
                    return redirect(url_for("charge_backs.get_charge_backs_list")) 

            # elif request.method == "POST":
            #     print(" in add on demand post request")
                
                
            #     print("((((((((((((((((request from))))))))))))))))",request.form)

                

            #     jsonData = request.form.to_dict(flat=True)
            #     requestData = [jsonData]
            #     updatedrequestData = [jsonData]

                
            #     admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
            #     if admin_queryset:
            #         # message=admin_queryset.userName+" "+chargeName+"On Demand Settlement Charge Created successfully!"
            #         # save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_on_demand_settlement_charge","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
            #         # print("((((((((((((save_admin_log_table))))))))))))",save_admin_log_table)
            
            #         # document_queryset = OnDemandSettlementCharges.objects(status=1).order_by("-id").first()
            #         # if document_queryset:
            #         # document_table = OnDemandSettlementCharges(
            #         #     chargeName=chargeName,
            #         #     paymentGatewayIdsList=paymentGatewayIdsList,
            #         #     holidayCalculation=holidayCalculation,
            #         #     maxDays=maxDays,
            #         #     priceType=priceType,
            #         #     chargeType=chargeType,
            #         #     chargeValue=chargeValue,
            #         #     gstInclude=gstInclude,
            #         #     gstValue=gstValue,
            #         #     tdsInclude=tdsInclude,
            #         #     tdsValue=tdsValue,
            #         #     status=1,
            #         #     createdOn = datetime.datetime.now()
            #         #     )
            #         # save_table = document_table.save()
            #         # flash("On Demand Settlement Charge created successfully!","success")
            #         data_status["responseStatus"]=1
            #         return data_status
            #     else:
            #         flash("Invalid request", "danger")
            #         data_status["responseStatus"]=4
            #         return data_status       

        else:
            flash("The staff member does not have permission to create a Charge back .", "danger")
            data_status['responseStatus']=4
            return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update Charge back details!!"
        flash(error,"danger")
        return redirect(url_for("charge_backs.get_charge_backs_list"))

class InitiateChargeBackForm(FlaskForm):
    print("in chargebackfetchform")
    chargeBackType = SelectField('', choices=[ ("wallet", "wallet"), ("utility", "utility"), ("digital_gold", "digital_gold")],validators=[ Optional() ], coerce=str)
    transactionRecordId = SelectField('', choices=[],validate_choice=False,validators=[Optional()])

    class Meta:
        csrf = False

@charge_backs.route("/initiate_chargeback_record", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def initiate_chargeback_record():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session expired.Please login again.","danger")
        return redirect(url_for("charge_backs.get_charge_backs_list")) 
    adminId = session.get("adminId")
    csrf_token = request.form.get("csrf_token")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr
    actionDate=datetime.datetime.now()
    form = InitiateChargeBackForm(request.form)
    chargeBackCreateDataList=[]
    try:
        permissionsList = check_permissions(session.get("adminId"),"chargeBackPermissions")
        if "add" in permissionsList:

            # print(" in add on demand")
            if request.method == "POST":
                chargeBackType = request.form.get("chargeBackType")
                transactionRecordId = request.form.get("transactionRecordId")

                print("request.form",request.form)

                walletTransactionId = None
                goldTransactionId = None
                transactionsWalletId = None
                if form.validate():
                # print(" in get route charge back report")
                    if chargeBackType == "wallet":
                        transactions_queryset = WalletTransactions.objects(id=transactionRecordId).first()
                        if not transactions_queryset:
                            flash("Invalid Type or PgOrder Id for Wallet","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))
                        walletTransactionId=ObjectId(transactionRecordId)
                        pgOrderId= transactions_queryset.pgOrderId
                        transactionId= transactions_queryset.transactionId

                    elif chargeBackType == "utility":
                        
                        transactions_queryset = Transactions.objects(id=transactionRecordId).first()
                        if not transactions_queryset:
                            flash("Invalid Type or PgOrder Id for Utility","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))
                        goldTransactionId=ObjectId(transactionRecordId)
                        transactionId= transactions_queryset.transactionId
                        pgOrderId= transactions_queryset.transactionId


                    elif chargeBackType == "digital_gold":
                        
                        transactions_queryset = GoldTransactions.objects(id=transactionRecordId).first()
                        if not transactions_queryset:
                            flash("Invalid Type or PgOrder Id for Digital Gold","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))
                        transactionsWalletId = ObjectId(transactionRecordId)
                        pgOrderId= transactions_queryset.pgOrderId
                        transactionId= transactions_queryset.transactionId

                    else:
                        # print("Invalid Type or PgOrder Id")
                        flash("Invalid Type or PgOrder Id!!!!!","danger")
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                    try:
                        existing_chargeback= ChargeBacks.objects(pgOrderId=pgOrderId).first()
                        if existing_chargeback:
                            flash("ChageBack Already exists for Given Transaction Id","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list")) 
                        charge_back_table = ChargeBacks(
                                userId = transactions_queryset.userId,
                                transactionId = transactionId,
                                transactionReferenceType = chargeBackType,
                                chargebackUtr = "",
                                pgOrderId = pgOrderId,
                                amount = transactions_queryset.amount,
                                reason = "",
                                chargeBackRaisedDate = datetime.datetime.now(),
                                createdOn = datetime.datetime.now(),
                                status = 3
                        ).save()
                        charge_back_table.update(
                            goldTransactionId=goldTransactionId,
                            walletTransactionId=walletTransactionId,
                            transactionsWalletId=transactionsWalletId,
                            )
                        flash("chargeBack record created successfully!!!","success")
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                    except Exception as e:
                        flash("Unable to create chargeback record.", "danger")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                else:
                    print("form errors", form.errors)
                    for field_name, error_list in form.errors.items():
                        for error in error_list:
                            flash(f"{field_name} {error}", "danger")
                    return redirect(url_for("charge_backs.get_charge_backs_list")) 
            else:
                return redirect(url_for("charge_backs.get_charge_backs_list")) 

        else:
            flash("The staff member does not have permission to create chargeback record","danger")
            return redirect(url_for("charge_backs.get_charge_backs_list")) 
           
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to create chargeback record details!!"
        flash(error,"danger")
        return redirect(url_for("charge_backs.get_charge_backs_list"))

@charge_backs.route("/update_chargeback_status", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def update_chargeback_status():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session expired.Please login again.","danger")
        data_status["responseStatus"]=4
        return data_status
    adminId = session.get("adminId")
    csrf_token = request.form.get("csrf_token")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr
    actionDate=datetime.datetime.now()
    form = InitiateChargeBackForm(request.form)
    chargeBackCreateDataList=[]
    try:
        permissionsList = check_permissions(session.get("adminId"),"chargeBackPermissions")
        if "edit" in permissionsList:

            # print(" in add on demand")
            if request.method == "POST":
                chargebackRecordId = request.args.get("chargebackRecordId")
                chargebackStatus = request.form.get("chargebackStatus")
                chargebackReason = request.form.get("chargebackReason")
                chargebackStatus=int(chargebackStatus)
                print("===================================================",request.form)
                print("chargebackstatus",type(chargebackStatus))
                if form.validate():
                    try:
                        charge_back_queryset = ChargeBacks.objects(id=chargebackRecordId).first()
                        if not charge_back_queryset:
                            flash("Invalid charge back record.", "danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))
                        if charge_back_queryset.transactionReferenceType != "wallet" and chargebackStatus == 2:
                            flash("Invalid charge back update Status for Wallet", "danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))

                        if chargebackStatus == 0:
                            charge_back_queryset.update(
                                status=0,
                                reason=chargebackReason,
                                )
                            print("update status to 0")
                        elif chargebackStatus == 1:
                            print("update status to 1")
                            user_queryset = Users.objects(id=charge_back_queryset.userId.id,status__ne=2).first()
                            print("update status to 1",user_queryset.fullName)
                            print("update status to 1",user_queryset.id)

                            if not user_queryset:
                                flash("Invalid User Data","danger")

                            existing_cap_balance = user_queryset.capBalance
                            new_cap_balance = existing_cap_balance + charge_back_queryset.amount
                            user_queryset.update(capBalance=new_cap_balance)

                            wallet_queryset = WalletTransactions.objects(id=charge_back_queryset.walletTransactionId.id,creditType="Credit").first()
                            if not wallet_queryset:
                                flash("Invalid Wallet Transaction Data", "danger")
                                return redirect(url_for("charge_backs.get_charge_backs_list"))
                            print("wallet_queryset.transactionId in update status 1 ")
                            user_commission_queryset = UserCommissions.objects(transactionId__in=[wallet_queryset.pgOrderId,wallet_queryset.transactionId]).all()

                            print("user_commission_queryset length",len(user_commission_queryset))

                            for each_user_commission in user_commission_queryset:
                                user_comm_queryset = Users.objects(id=each_user_commission.userId.id).first()
                                commissionBalance = user_comm_queryset.commissionBalance

                                newPrevBal = commissionBalance

                                newCurrBal = commissionBalance - each_user_commission.totalAmount

                                user_commissions_table = UserCommissions(
                                        adminId = each_user_commission.adminId,
                                        userId = str(each_user_commission.userId.id),
                                        childUserId = str(each_user_commission.childUserId.id) if each_user_commission.childUserId and each_user_commission.childUserId.id else None,
                                        slabId = str(each_user_commission.slabId.id),
                                        commissionfor = each_user_commission.commissionfor,
                                        transactionId = each_user_commission.transactionId,
                                        paymentModeId = str(each_user_commission.paymentModeId.id) if each_user_commission.paymentModeId and each_user_commission.paymentModeId.id else None,
                                        subPaymentModeId = str(each_user_commission.subPaymentModeId.id) if each_user_commission.subPaymentModeId and each_user_commission.subPaymentModeId.id else None,
                                        walletId = str(each_user_commission.walletId.id) if each_user_commission.walletId and each_user_commission.walletId.id else None,
                                        transactionAPIId = str(each_user_commission.transactionAPIId.id) if each_user_commission.transactionAPIId and each_user_commission.transactionAPIId.id else None,
                                        totalAmount = each_user_commission.totalAmount,
                                        childCommissionValue = each_user_commission.childCommissionValue,
                                        childCommissionType = each_user_commission.childCommissionType,
                                        parrentSlabCommissionType = each_user_commission.parrentSlabCommissionType,
                                        parrentSlabCommissionValue = each_user_commission.parrentSlabCommissionValue,
                                        parrentCommissionType = each_user_commission.parrentCommissionType,
                                        comment =  "Chargeback Raised",
                                        transferType = "Debit",
                                        parrentCommissionAmount = each_user_commission.parrentCommissionAmount,
                                        parentGstAmount = each_user_commission.parentGstAmount,
                                        parentTdsAmount = each_user_commission.parentTdsAmount,
                                        previousBalance = newPrevBal,
                                        currentBalance = newCurrBal,
                                        parentcommissionData = each_user_commission.parentcommissionData,
                                        createdOn = datetime.datetime.now(),
                                        status = 1,
                                        settlementStatus = each_user_commission.settlementStatus,
                                        siteTitle = each_user_commission.siteTitle,
                                ).save()
                                user_comm_queryset.update(commissionBalance=newCurrBal)
                            print("wallet_queryset.id",wallet_queryset.id)
                            company_queryset = CompanyCommissions.objects(walletId=ObjectId(wallet_queryset.id)).first()
                            # if not company_queryset:
                            #     flash("No company Commission Record exist for this transaction Id!!")
                            #     return redirect(url_for("charge_backs.get_charge_backs_list"))
                            
                            if company_queryset:
                                company_table_record = CompanyCommissions(
                                    userId = company_queryset.userId,
                                    userPatternId = company_queryset.userPatternId,
                                    slabId = company_queryset.slabId,
                                    paymentModeId = company_queryset.paymentModeId,
                                    subPaymentModeId = company_queryset.subPaymentModeId,
                                    commissionfor = company_queryset.commissionfor,
                                    transferType = "Debit",
                                    transactionId = company_queryset.transactionId,
                                    transactionAPIId = company_queryset.transactionAPIId,
                                    totalAmount = company_queryset.totalAmount,
                                    comment = company_queryset.comment,
                                    walletId = company_queryset.walletTransactionId.id,
                                    childCommissionCharges = company_queryset.childCommissionCharges,
                                    aggregatorCommissionCharges = company_queryset.aggregatorCommissionCharges,
                                    commissionAmount = company_queryset.commissionAmount,
                                    aggregatorCommissionAmount = company_queryset.aggregatorCommissionAmount,
                                    createdOn = datetime.datetime.now(),
                                    status = company_queryset.status,
                                    settlementStatus = company_queryset.settlementStatus,
                                    transactionCommissionCharges = company_queryset.transactionCommissionCharges,
                                    siteTitle = company_queryset.siteTitle,
                                ).save()

                            charge_back_queryset.update(status=1,
                                reason=chargebackReason)
                            print("update status to 1")

                        elif chargebackStatus == 2:
                            ##### new in record  in  wallet txn and decrease cap bal with taxn amout
                            new_record_response = handle_new_record(charge_back_queryset,adminId)
                            print("new_record_response",new_record_response)
                            if new_record_response.get("responseStatus") == 0 :
                                flash(new_record_response.get("result","Unable to add new record for chargeback Recovery"))
                                return redirect(url_for("charge_backs.get_charge_backs_list"))
                            charge_back_queryset.update(status=2,
                                reason=chargebackReason)

                            print("update status to 2")
                        elif   chargebackStatus == 4:
                            charge_back_queryset.update(status=4,
                                reason=chargebackReason)
                            print("update status to 4")
                        elif   chargebackStatus == 5:
                            charge_back_queryset.update(status=5,
                                reason=chargebackReason)
                            print("update status to 5")
                        elif  chargebackStatus == 3:
                            flash("Cannot change status back to initiated!!!","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))
                        else:
                            flash("Invalid Change status !!!","danger")
                            return redirect(url_for("charge_backs.get_charge_backs_list"))

                        flash("chargeBack record Updated successfully!!!","success")
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                    except Exception as e:
                        flash("Unable to create chargeback record.", "danger")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("charge_backs.get_charge_backs_list"))
                else:
                    print("form errors", form.errors)
                    for field_name, error_list in form.errors.items():
                        for error in error_list:
                            flash(f"{field_name} {error}", "danger")
                    return redirect(url_for("charge_backs.get_charge_backs_list")) 
            else:
                return redirect(url_for("charge_backs.get_charge_backs_list")) 

        else:
            flash("The staff member does not have permission to update charge back record.", "danger")
            return redirect(url_for("charge_backs.get_charge_backs_list"))
           
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update chargeback record details!!"
        flash(error,"danger")
        return redirect(url_for("charge_backs.get_charge_backs_list"))

def handle_new_record(charge_back_queryset,adminId):
    data_status = {"responseStatus": 0,"result":""}
    try:
        print("in handle new record when status is 2 ")
        wallet_query_set_data = WalletTransactions.objects(id=charge_back_queryset.walletTransactionId.id).first()
        if not wallet_query_set_data:
            data_status["result"]="Invalid wallet Id when creating new Record"
            return data_status
        fund_transfer_queryset = FundTransfers.objects(pgOrderId=wallet_query_set_data.pgOrderId,fundTransferType="admin",transferType="Debit").first() ###doubt
        if fund_transfer_queryset:
            data_status["result"]="Already Recovered From Agents"
            return data_status
        userId=wallet_query_set_data.userId.id
        transactionAPIId = wallet_query_set_data.userId.patternId.payoutPaymentGatewayId.id
        wallet_query_set = wallet_query_set_data.to_mongo()
        payout_bal_update_response = user_payout_balance_update(userId,wallet_query_set.get('amount'),transfertype="Debit",transactionAPIId=transactionAPIId)
        
        currentBalance = payout_bal_update_response.get("userCurrentBalance")
        previousBalance = payout_bal_update_response.get("userPreviousBalance")

        fund_transfer_table = FundTransfers(
            createdBy=adminId,
            userId=userId,
            slabId=wallet_query_set.get('slabId', None),
            transactionAPIId=transactionAPIId, 
            bankId="",
            bankName=wallet_query_set.get('bankName', None),
            merchantReferenceNumber=wallet_query_set.get('orderId', None),
            fundTransferType="admin", 
            accountType="",
            apiType="app",
            bankBranch="",
            accountNumber="",
            accountIFSCCode="",
            beneficiaryName="",
            uniqueRequestNumber="",
            amount=round(float(wallet_query_set.get('amount')),2),
            grandTotal=round(float(wallet_query_set.get('amount')),2), 
            transferType="Debit",
            beneficiaryMail="",
            beneficiaryPhone="", 
            paymentMode="wallet",
            narration="",
            commissionCharges={}, ###no 
            createdOn=datetime.datetime.now(),
            pgOrderId=wallet_query_set.get('pgOrderId', None), 
            statusCheckId = wallet_query_set.get('pgOrderId', None),
            transactionUniqueId=wallet_query_set.get('transactionId', None), 
            userType="user",
            siteTitle=wallet_query_set.get('siteTitle', None),
            previousBalance = round(float(previousBalance),2),
            currentBalance = round(float(currentBalance),2),
            aggregatorCharges={},
            errorMessage="ChargeBack Retrieval",
            overallCommissionAmount=round(float(0),2),
            status=1
        ).save()
        user_queryset = Users.objects(id=wallet_query_set_data.userId.id).first()
        updatedCapBalance=user_queryset.capBalance - wallet_query_set_data.amount
        user_queryset.update(capBalance=updatedCapBalance)
        print("update capbaalacne is ",user_queryset.capBalance)
        data_status["responseStatus"] = 1
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to add new record for chargeback Recovery"
        print("in Exception handle new record when status is 2 ")
        return data_status