from appservices.common.util import *

bank_codes = Blueprint("bank_codes",__name__)

def fetching_bank_codes(bank_codes_queryset):
    bank_codes_dict = {}
    try:
        bank_codes_dict={
        "id":str(bank_codes_queryset.id),
        "bankCode":bank_codes_queryset.bankCode,
        
       
        }
        try:
            if bank_codes_queryset.bankId:
                
                bank_codes_dict["bankId"]=str(bank_codes_queryset.bankId.id)
                bank_codes_dict["bankName"]=bank_codes_queryset.bankId.bankName
            else:
                bank_codes_dict["bankId"]=""
                bank_codes_dict["bankName"]=""
        except Exception as e:
            bank_codes_dict["bankId"]=""
            bank_codes_dict["bankName"]=""

        if bank_codes_queryset.transactionApiIdsList:
            bank_codes_dict["transactionApiIdsList"] = [
                str(each_api.id) for each_api in bank_codes_queryset.transactionApiIdsList
            ]
            api_names_list = [
                each_api.apiName for each_api in bank_codes_queryset.transactionApiIdsList
            ]
            bank_codes_dict["apiName"] = ', '.join(api_names_list)  # Combine names for display
        else:
            bank_codes_dict["transactionApiIdsList"] = []
            bank_codes_dict["apiName"] = ""


        
        if bank_codes_queryset.status==1:
            bank_codes_dict["actionText"] = "Active"
        else:
            bank_codes_dict["actionText"] = "Deactive"

        

        if bank_codes_queryset.createdOn:
            bank_codes_dict["createdOn"] = bank_codes_queryset.createdOn.strftime("%d-%m-%Y")
        else:
            bank_codes_dict["createdOn"] = ""

        

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return bank_codes_dict

@bank_codes.route("/bank_codes_list", methods=["POST", "GET"])
def bank_codes_list():
    if not session.get("adminId"):
        return redirect("admin_login")

    bankCodesList = []
    apiList = []
    banksList = []
    bankCodesPagination = ""

   
    adminId = session.get("adminId")
    # permissionsList = check_permissions(session.get("adminId"), "subservicesPermissions")
    # print(permissionsList, "((((((((permissionsList))))))))")

    # if "view" in permissionsList:
    try:
        redirectTo = request.args.get("redirectTo", "bank_codes")
        redirectval = redirectTo if redirectTo else "bank_codes"

        
    

        ###############################################################
        # Fetch schemes list, latest 20 records if no pagination params
        ###############################################################
        bank_codes_queryset = BankCodes.objects(status__in=[0, 1]).order_by("-sorting")
        
        

        

        # Parse and apply start and end dates only if they are provided
        

        

        # Set up pagination: fetch the latest 20 records if no pagination params
        bankCodesPage = request.args.get(get_page_parameter('bankCodesPage'), type=int, default=1)
        per_page = 20
        total_count = bank_codes_queryset.count()
        start = (bankCodesPage - 1) * per_page
        end = min(start + per_page, total_count)

        total_bank_codes = bank_codes_queryset[start:end]
       
        snoCount = start
        for each_bank_code in total_bank_codes:
            snoCount += 1
            bank_codes_dict = fetching_bank_codes(each_bank_code)
            bank_codes_dict["snoCount"] = snoCount
            bankCodesList.append(bank_codes_dict)

        bankCodesPagination = Pagination(bankCodesPage=bankCodesPage, total=total_count, page_parameter="bankCodesPage", per_page=per_page, alignment="right", record_name="bankCode")

        ############################################################
        # Category Dropdown List
        ############################################################
        api_queryset = TransactionAPI.objects(status__in=[0, 1]).order_by('sorting')
        for each_api in api_queryset:

            api_dict = fetching_transaction_api_details(each_api)
            apiList.append(api_dict)

        banks_queryset = MasterIFSCBank.objects(status__in=[0, 1]).order_by('sorting')
        for each_bank in banks_queryset:

            bank_dict = fetching_master_ifsc_bank_details(each_bank)
            banksList.append(bank_dict)

        
       
        return render_template("super_admin_templates/bank_codes_list.html",
            bankCodesPagination=bankCodesPagination,
            banksList=banksList,
            bankCodesList=bankCodesList,
            apiList=apiList,
            redirectval=redirectval,
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch Bank Codes !!"
        return render_template("super_admin_templates/bank_codes_list.html",
            bankCodesPagination=bankCodesPagination,
            banksList=banksList,
            bankCodesList=bankCodesList,
            apiList=apiList,
            redirectval=redirectval,
        )
    # else:
    #     flash("Staff member does not have given view Bank Code permissions!!")
    #     return redirect(url_for("admin.dashboard"))


@bank_codes.route("/add_bank_code", methods=["POST", "GET"])
def add_bank_code():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        # permissionsList = check_permissions(adminId,"subservicesPermissions")
        # if "add" in permissionsList:
        if request.method == "POST":
            bankId = request.form.get("bankId", "")
            bankCode = request.form.get("bankCode", "")
            transactionApiIdsList = request.form.getlist("transactionApiIdsList")
            print(transactionApiIdsList,"((((((((((((((((transactionApiIdsList))))))))))))))))")
            # The date format for the input type "date" is "YYYY-MM-DD"
            if bankId and transactionApiIdsList:

                try:
                    admin_queryset = SuperAdmin.objects(id=adminId, status=1).first()

                    bank_codes_table = BankCodes(
                        # adminId=adminId,
                        bankId=bankId,
                        transactionApiIdsList=transactionApiIdsList,
                        bankCode=bankCode,
                        createdOn=datetime.datetime.now(),
                        status=1,
                            
                    )
                    save_table = bank_codes_table.save()  
                    bankCodeId = str(bank_codes_table.id)
                    flash("Bank Code saved successfully!")
                    return redirect(url_for("bank_codes.bank_codes_list"))
                except Exception as e:
                    flash("Unable to save Bank Code!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("bank_codes.bank_codes_list"))
            else:
                flash("Required fields are missing!")
                return redirect(url_for("bank_codes.bank_codes_list"))
            # else:
            #     flash("Staff member does not have given create Schemes permissions!!")
            # return redirect(url_for("bank_codes.bank_codes_list"))

    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to Add Bank Code!"
        return render_template("super_admin_templates/bank_codes_list.html", error=error)


@bank_codes.route("/update_bank_code_status",methods=["POST","GET"])
def update_bank_code_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
   
    # permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
    # if "edit" in permissionsList:
    bankCodeId = request.args.get("bankCodeId","")
    if bankCodeId:
        try:
            bank_codes_queryset = BankCodes.objects(id=bankCodeId,status__nin=[2]).first()
           
            if bank_codes_queryset:
                if bank_codes_queryset.status == 0:
                    bank_codes_queryset.update(status=1)
                    flash("Bank Code activated successfully!")
                   
                elif bank_codes_queryset.status == 1:
                    bank_codes_queryset.update(status=0)
                    flash("Bank Code deactivated successfully!")
                   
                return redirect(url_for("bank_codes.bank_codes_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("bank_codes.bank_codes_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("bank_codes.bank_codes_list"))
    else:
        return redirect(url_for("bank_codes.bank_codes_list"))
    # else:
    #     flash("Staff member does not have given update status Bank Codes permissions!!")
    #     return redirect(url_for("bank_codes.bank_codes_list"))



# Update scheme
@bank_codes.route("/update_bank_code",methods=["POST","GET"])
def update_bank_code():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")  
     
    date_format = "%Y-%m-%d"
    # permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
    # if "edit" in permissionsList:
    try:
        bankCodeId = request.args.get("bankCodeId","")
        if request.method == "POST":
            bankId = request.form.get("bankId","")
            transactionApiIdsList = [ObjectId(api_id) for api_id in request.form.getlist("transactionApiIdsList")]
            bankCode = request.form.get("bankCode","")
           
            bank_codes_queryset = BankCodes.objects(id=bankCodeId).first()
            if bank_codes_queryset:
                bank_codes_queryset.update(
                    transactionApiIdsList=transactionApiIdsList,
                    bankId=ObjectId(bankId),
                    bankCode=bankCode,
                    )
                flash("Bank Code updated successfully!")
                return redirect(url_for("bank_codes.bank_codes_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("bank_codes.bank_codes_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update Bank Code!!"
        return redirect(url_for("bank_codes.bank_codes_list"))
    # else:
    #     flash("Staff member does not have given update Bank Codes permissions!!")
    #     return redirect(url_for("bank_codes.bank_codes_list"))


# Delete scheme
@bank_codes.route("/delete_bank_code",methods=["GET"])
def delete_bank_code():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        # permissionsList = check_permissions(session.get("adminId"),"subservicesPermissions")
        # if "delete" in permissionsList:
        if request.method == "GET":
            bankCodeId = request.args.get("bankCodeId","")
            bank_codes_queryset = BankCodes.objects(id=bankCodeId,status__in=[0,1]).first()
            bank_codes_queryset.update(status=2)
            flash("Bank Code deleted successfully!")
            return redirect(url_for("bank_codes.bank_codes_list"))
        # else:
        #     flash("Staff member does not have given delete Bank Codes permissions!!")
        #     return redirect(url_for("bank_codes.bank_codes_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete Bank Code!!")
        return redirect(url_for("bank_codes.bank_codes_list"))