from appservices.common.util import *

merchant_categories = Blueprint("merchant_categories",__name__)

############### Merchant Ccategories ################

@merchant_categories.route("/add_merchant_category",methods=["POST","GET"])
@adminid_access_token_required
def add_merchant_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        permissionsList = check_permissions(adminId,"merchantCategoriesPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                categoryCode = request.form.get("categoryCode","")
                isUserWise = request.form.get("isUserWise",False)

                if name and categoryCode and isUserWise:
                    try:
                        category_table = MerchantCategories(
                            adminId=adminId,
                            name = name,
                            categoryCode = categoryCode,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = category_table.save()
                        if isUserWise == "True":
                            save_table.update(isUserWise=True)
                        if isUserWise == "False":
                            save_table.update(isUserWise=False)

                        flash("Category saved successfully!")
                        return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
                    except Exception as e:
                        flash("Unable to save category details!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
        else:
            flash("Staff member does not have given create merchant category permissions!!")
            return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save category details!!"
        return render_template("super_admin_templates/merchant_categories_list.html",error=error,redirectTo="Category")



@merchant_categories.route("/update_merchant_category",methods=["POST","GET"])
@adminid_access_token_required
def update_merchant_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"merchantCategoriesPermissions")
    if "edit" in permissionsList:
        try:
            categoryId = request.args.get("categoryId","")
            if request.method == "POST":
                name = request.form.get("name","")
                categoryCode = request.form.get("categoryCode","")
                isUserWise = request.form.get("isUserWise",False)

                if name and categoryCode and isUserWise:
                    category_queryset = MerchantCategories.objects(id=categoryId,status__in=[0,1]).first()
                    if category_queryset:
                        category_queryset.update(
                            name = name,
                            categoryCode = categoryCode
                            )
                        if isUserWise == "True":
                            category_queryset.update(isUserWise=True)
                        if isUserWise == "False":
                            category_queryset.update(isUserWise=False)
                        flash("Category updated successfully!")
                        return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update category details!!"
            return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
    else:
        flash("Staff member does not have given update merchant category permissions!!")
        return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))

@merchant_categories.route("/get_merchant_categories_list",methods=["POST","GET"])
@adminid_access_token_required
def get_merchant_categories_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    categorysList = []
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"merchantCategoriesPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Category")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Category"
            search_element = request.form.get("search_element","")

            merchant_categorys_queryset = MerchantCategories.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                merchant_categorys_queryset = merchant_categorys_queryset.filter(Q(name__icontains=search_element))

            for each_merchant_category in merchant_categorys_queryset:
                merchant_category_dict = fetching_merchant_category_details(each_merchant_category)
                categorysList.append(merchant_category_dict)
            
            return render_template("super_admin_templates/merchant_categories_list.html",
                categorysList=categorysList,
                redirectval=redirectval,
                search_element=search_element
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch categories details!!"
            return render_template("super_admin_templates/merchant_categories_list.html", 
                error=error,
                categorysList=categorysList,
                search_element=search_element
            )
    else:
        flash("Staff member does not have given view merchant category permissions!!")
        return render_template("super_admin_templates/merchant_categories_list.html")

@merchant_categories.route("/update_merchant_category_status",methods=["POST","GET"])
@adminid_access_token_required
def update_merchant_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"merchantCategoriesPermissions")
    if "edit" in permissionsList:
        categoryId = request.args.get("categoryId","")

        if categoryId:
            try:
                merchant_category_queryset = MerchantCategories.objects(id=categoryId,status__in=[0,1]).first()
                if merchant_category_queryset:
                    if merchant_category_queryset.status == 0:
                        merchant_category_queryset.update(status=1)
                        flash("Category activated successfully!")
                    elif merchant_category_queryset.status == 1:
                        merchant_category_queryset.update(status=0)
                        flash("Category deactivated successfully!")
                    return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))
    else:
        flash("Staff member does not have given update status merchant category permissions!!")
        return redirect(url_for("merchant_categories.get_merchant_categories_list",redirectTo="Category"))


############### Merchant Sub Ccategories ################

@merchant_categories.route("/add_sub_merchant_category",methods=["POST","GET"])
@adminid_access_token_required
def add_sub_merchant_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        permissionsList = check_permissions(session.get("adminId"),"merchantSubCategoriesPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")
                categoryId = request.form.get("categoryId","")

                if name and categoryId:
                    try:
                        sub_category_table = MerchantSubCategories(
                            adminId=adminId,
                            name = name,
                            categoryId = categoryId,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = sub_category_table.save()

                        flash("Sub category saved successfully!")
                        return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
                    except Exception as e:
                        flash("Unable to save sub category details!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
        else:
            flash("Staff member does not have given create merchant sub category permissions!!")
            return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save sub category details!!"
        return render_template("super_admin_templates/merchant_sub_categories_list.html",error=error,redirectTo="Subcategory")


@merchant_categories.route("/update_sub_merchant_category",methods=["POST","GET"])
@adminid_access_token_required
def update_sub_merchant_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"merchantSubCategoriesPermissions")
    if "edit" in permissionsList:
        try:
            subCategoryId = request.args.get("subCategoryId","")
            if request.method == "POST":
                name = request.form.get("name","")
                categoryId = request.form.get("categoryId","")

                if name and categoryId:
                    category_queryset = MerchantSubCategories.objects(id=subCategoryId,status__in=[0,1]).first()
                    if category_queryset:
                        category_queryset.update(
                            name = name,
                            categoryId = ObjectId(categoryId)
                            )
                        flash("Sub category updated successfully!")
                        return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update sub category details!!"
            flash(error)
            return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
    else:
        flash("Staff member does not have given update merchant sub category permissions!!")
        return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))

@merchant_categories.route("/get_merchant_sub_categories_list",methods=["POST","GET"])
@adminid_access_token_required
def get_merchant_sub_categories_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    categorysList = []
    subCategorysList = []
    
    adminId = session.get("adminId")

    permissionsList = check_permissions(session.get("adminId"),"merchantSubCategoriesPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Subcategory")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Subcategory"
            search_element = request.form.get("search_element","")

            page = request.args.get(get_page_parameter(), type=int, default=1)
            page_start,page_end=fetch_limit_length_based_on_page_index(page,10)

            sub_merchant_categorys_queryset = MerchantSubCategories.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                sub_merchant_categorys_queryset = sub_merchant_categorys_queryset.filter(Q(name__icontains=search_element))
            length = sub_merchant_categorys_queryset.count()
            sub_merchant_categorys_queryset=sub_merchant_categorys_queryset[page_start:page_end]

            for each_sub_merchant_category in sub_merchant_categorys_queryset:
                sub_merchant_category_dict = fetching_sub_merchant_category_details(each_sub_merchant_category)
                subCategorysList.append(sub_merchant_category_dict)


            merchant_categorys_queryset = MerchantCategories.objects(status__in=[0,1]).order_by("-id").all()
            for each_merchant_category in merchant_categorys_queryset:
                merchant_category_dict = fetching_merchant_category_details(each_merchant_category)
                categorysList.append(merchant_category_dict)

            
            pagination = Pagination(
                page=page,
                total=length,
                record_name='sub_merchant_categories',
                per_page=10,
                alignment="right"
                )
            return render_template("super_admin_templates/merchant_sub_categories_list.html",
                categorysList=categorysList,
                subCategorysList=subCategorysList,
                redirectval=redirectval,
                pagination=pagination,
                search_element=search_element
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch sub categories details!!"
            return render_template("super_admin_templates/merchant_sub_categories_list.html", 
                error=error,
                categorysList=categorysList,
                subCategorysList=subCategorysList,
                pagination=pagination,
                search_element=search_element
            )
    else:
        flash("Staff member does not have given view merchant sub category permissions!!")
        return render_template("super_admin_templates/merchant_sub_categories_list.html")

@merchant_categories.route("/update_sub_merchant_category_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sub_merchant_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"merchantSubCategoriesPermissions")
    if "edit" in permissionsList:
        subCategoryId = request.args.get("subCategoryId","")

        if subCategoryId:
            try:
                sub_merchant_category_queryset = MerchantSubCategories.objects(id=subCategoryId,status__in=[0,1]).first()
                if sub_merchant_category_queryset:
                    if sub_merchant_category_queryset.status == 0:
                        sub_merchant_category_queryset.update(status=1)
                        flash("Sub category activated successfully!")
                    elif sub_merchant_category_queryset.status == 1:
                        sub_merchant_category_queryset.update(status=0)
                        flash("Sub category deactivated successfully!")
                    return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))
    else:
        flash("Staff member does not have given update status merchant sub category permissions!!")
        return redirect(url_for("merchant_categories.get_merchant_sub_categories_list",redirectTo="Subcategory"))

############### Networks ################

@merchant_categories.route("/add_network",methods=["POST","GET"])
@adminid_access_token_required
def add_network():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        permissionsList = check_permissions(adminId,"networksPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                name = request.form.get("name","")

                if name:
                    try:
                        network_table = Networks(
                            adminId=adminId,
                            name = name,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = network_table.save()

                        flash("Network saved successfully!")
                        return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
                    except Exception as e:
                        flash("Unable to save network details!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
        else:
            flash("Staff member does not have given create network permissions!!")
            return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save network details!!"
        return render_template("super_admin_templates/network_list.html",error=error,redirectTo="Network")

def fetching_network_details(network_queryset):
    network_dict = {}
    try:
        network_dict={
        "id":str(network_queryset.id),
        "name":network_queryset.name
        }
        if network_queryset.status==1:
            network_dict["actionText"] = "Active"
        else:
            network_dict["actionText"] = "Deactive"

        if network_queryset.createdOn:
            network_dict["createdOn"] = network_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            network_queryset["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return network_dict

@merchant_categories.route("/update_network",methods=["POST","GET"])
@adminid_access_token_required
def update_network():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"networksPermissions")
    if "edit" in permissionsList:
        try:
            networkId = request.args.get("networkId","")
            if request.method == "POST":
                name = request.form.get("name","")

                if name and networkId:
                    network_queryset = Networks.objects(id=networkId,status__in=[0,1]).first()
                    if network_queryset:
                        network_queryset.update(
                            name = name
                            )
                        flash("Network updated successfully!")
                        return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update network details!!"
            flash(error)
            return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
    else:
        flash("Staff member does not have given update network permissions!!")
        return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))

@merchant_categories.route("/get_network_list",methods=["POST","GET"])
@adminid_access_token_required
def get_network_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    networksList = []
    
    adminId = session.get("adminId")

    permissionsList = check_permissions(session.get("adminId"),"networksPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Network")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Network"
            search_element = request.form.get("search_element","")

            page = request.args.get(get_page_parameter(), type=int, default=1)
            page_start,page_end=fetch_limit_length_based_on_page_index(page,10)

            networks_queryset = Networks.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                networks_queryset = networks_queryset.filter(Q(name__icontains=search_element))
            length = networks_queryset.count()
            networks_queryset=networks_queryset[page_start:page_end]

            for each_network in networks_queryset:
                network_dict = fetching_network_details(each_network)
                networksList.append(network_dict)

            
            pagination = Pagination(
                page=page,
                total=length,
                record_name='networks',
                per_page=10,
                alignment="right"
                )
            return render_template("super_admin_templates/network_list.html",
                networksList=networksList,
                redirectval=redirectval,
                pagination=pagination,
                search_element=search_element
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch sub categories details!!"
            return render_template("super_admin_templates/network_list.html", 
                error=error,
                networksList=networksList,
                pagination=pagination,
                search_element=search_element
            )
    else:
        flash("Staff member does not have given view network permissions!!")
        return render_template("super_admin_templates/network_list.html")

@merchant_categories.route("/update_network_status",methods=["POST","GET"])
@adminid_access_token_required
def update_network_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    permissionsList = check_permissions(session.get("adminId"),"networksPermissions")
    if "edit" in permissionsList:
        networkId = request.args.get("networkId","")

        if networkId:
            try:
                network_queryset = Networks.objects(id=networkId,status__in=[0,1]).first()
                if network_queryset:
                    if network_queryset.status == 0:
                        network_queryset.update(status=1)
                        flash("Network activated successfully!")
                    elif network_queryset.status == 1:
                        network_queryset.update(status=0)
                        flash("Network deactivated successfully!")
                    return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))
    else:
        flash("Staff member does not have given status update network permissions!!")
        return redirect(url_for("merchant_categories.get_network_list",redirectTo="Network"))

############### Bank Bins ################

@merchant_categories.route("/add_bank_bin",methods=["POST","GET"])
@adminid_access_token_required
def add_bank_bin():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

        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()

        permissionsList = check_permissions(adminId,"bankBinsPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                iiN = request.form.get("iiN",0)
                entity = request.form.get("entity","")
                bankBinType = request.form.get("bankBinType","")
                bankBinSubType = request.form.get("bankBinSubType","")
                cardIin = request.form.get("cardIin","")
                issuerCode = request.form.get("issuerCode","")
                issuerName = request.form.get("issuerName","")
                authType = request.form.get("authType","")
                international = request.form.get("international","")
                tokenisedIin = request.form.get("tokenisedIin","")
                emi = request.form.get("emi","")
                recurring = request.form.get("recurring","")
                networkId = request.form.get("networkId","")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if iiN and entity and bankBinType and bankBinSubType and cardIin and issuerCode and issuerName and authType and international and tokenisedIin and emi and recurring and networkId:
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+issuerName+" Bank bin created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_bank_bin","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                        bank_bin_table = BankBins(
                            adminId=adminId,
                            iiN = iiN,
                            entity = entity,
                            bankBinType = bankBinType,
                            bankBinSubType = bankBinSubType,
                            cardIin = cardIin,
                            issuerCode = issuerCode,
                            issuerName = issuerName,
                            authType = authType,
                            international = international,
                            tokenisedIin = tokenisedIin,
                            emi = emi,
                            recurring = recurring,
                            networkId = networkId,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = bank_bin_table.save()

                        flash("Bank bin saved successfully!")
                        return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
                    except Exception as e:
                        flash("Unable to save bank bin details!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
        else:
            flash("Staff member does not have given create bank bin permissions!!")
            return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save bank bin details!!"
        return render_template("super_admin_templates/bank_bins_list.html",error=error,redirectTo="Bankbin")

def fetching_bank_bin_details(bank_bin_queryset):
    bank_bin_dict = {}
    try:
        bank_bin_dict={
        "id":str(bank_bin_queryset.id),
        "iiN":bank_bin_queryset.iiN,
        "entity":bank_bin_queryset.entity,
        "bankBinType":bank_bin_queryset.bankBinType,
        "bankBinSubType":bank_bin_queryset.bankBinSubType,
        "cardIin":bank_bin_queryset.cardIin,
        "issuerCode":bank_bin_queryset.issuerCode,
        "issuerName":bank_bin_queryset.issuerName,
        "authType":bank_bin_queryset.authType,
        "international":bank_bin_queryset.international,
        "tokenisedIin":bank_bin_queryset.tokenisedIin,
        "emi":bank_bin_queryset.emi,
        "recurring":bank_bin_queryset.recurring,
        "networkId":str(bank_bin_queryset.networkId.id),
        "networkName":bank_bin_queryset.networkId.name
        }
        if bank_bin_queryset.status==1:
            bank_bin_dict["actionText"] = "Active"
        else:
            bank_bin_dict["actionText"] = "Deactive"

        if bank_bin_queryset.createdOn:
            bank_bin_dict["createdOn"] = bank_bin_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            bank_bin_queryset["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return bank_bin_dict

@merchant_categories.route("/update_bank_bin",methods=["POST","GET"])
@adminid_access_token_required
def update_bank_bin():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId") 

    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()

    permissionsList = check_permissions(session.get("adminId"),"bankBinsPermissions")
    if "edit" in permissionsList:
        try:
            bankBinId = request.args.get("bankBinId","")
            if request.method == "POST":
                iiN = request.form.get("iiN",0)
                entity = request.form.get("entity","")
                bankBinType = request.form.get("bankBinType","")
                bankBinSubType = request.form.get("bankBinSubType","")
                cardIin = request.form.get("cardIin","")
                issuerCode = request.form.get("issuerCode","")
                issuerName = request.form.get("issuerName","")
                authType = request.form.get("authType","")
                international = request.form.get("international","")
                tokenisedIin = request.form.get("tokenisedIin","")
                emi = request.form.get("emi","")
                recurring = request.form.get("recurring","")
                networkId = request.form.get("networkId","")

                jsonData = request.form.to_dict(flat=True)

                if bankBinId and iiN and entity and bankBinType and bankBinSubType and cardIin and issuerCode and issuerName and authType and international and tokenisedIin and emi and recurring and networkId:
                    bank_bin_queryset = BankBins.objects(id=bankBinId,status__in=[0,1]).first()
                    message=bank_bin_queryset.adminId.userName+" "+issuerName+" Bank bin updated successfully!"
                    requestData=[bank_bin_queryset]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_bank_bin","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                    if bank_bin_queryset:
                        bank_bin_queryset.update(
                            iiN = iiN,
                            entity = entity,
                            bankBinType = bankBinType,
                            bankBinSubType = bankBinSubType,
                            cardIin = cardIin,
                            issuerCode = issuerCode,
                            issuerName = issuerName,
                            authType = authType,
                            international = international,
                            tokenisedIin = tokenisedIin,
                            emi = emi,
                            recurring = recurring,
                            networkId = ObjectId(networkId)
                            )
                        flash("Bank bin updated successfully!")
                        return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to update bank bin details!!"
            flash(error)
            return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
    else:
        flash("Staff member does not have given update bank bin permissions!!")
        return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))


@merchant_categories.route("/get_bank_bin_list",methods=["POST","GET"])
@adminid_access_token_required
def get_bank_bin_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    bankBinsList = []
    networksList = []
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"bankBinsPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","Bankbin")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Bankbin"
            search_element = request.form.get("search_element","")

            page = request.args.get(get_page_parameter(), type=int, default=1)
            page_start,page_end=fetch_limit_length_based_on_page_index(page,10)

            bank_bins_queryset = BankBins.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                bank_bins_queryset = bank_bins_queryset.filter(Q(iiN__icontains=search_element))
            length = bank_bins_queryset.count()
            bank_bins_queryset=bank_bins_queryset[page_start:page_end]

            for each_bank_bin in bank_bins_queryset:
                bank_bin_dict = fetching_bank_bin_details(each_bank_bin)
                bankBinsList.append(bank_bin_dict)

            networks_queryset = Networks.objects(status__in=[0,1]).order_by("-id").all()
            for each_network in networks_queryset:
                network_dict = fetching_network_details(each_network)
                networksList.append(network_dict)

            pagination = Pagination(
                page=page,
                total=length,
                record_iiN='bank_bins',
                per_page=10,
                alignment="right"
                )
            return render_template("super_admin_templates/bank_bins_list.html",
                bankBinsList=bankBinsList,
                networksList=networksList,
                redirectval=redirectval,
                pagination=pagination,
                search_element=search_element
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch sub categories details!!"
            return render_template("super_admin_templates/bank_bins_list.html", 
                error=error,
                bankBinsList=bankBinsList,
                networksList=networksList,
                pagination=pagination,
                search_element=search_element
                )
    else:
        flash("Staff member does not have given view bank bin permissions!!")
        return render_template("super_admin_templates/bank_bins_list.html")

@merchant_categories.route("/update_bank_bin_status",methods=["POST","GET"])
@adminid_access_token_required
def update_bank_bin_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")

    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()

    jsonData = request.form.to_dict(flat=True)

    requestData = [jsonData]
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"bankBinsPermissions")
    if "edit" in permissionsList:
        bankBinId = request.args.get("bankBinId","")

        if bankBinId:
            try:
                bank_bin_queryset = BankBins.objects(id=bankBinId,status__in=[0,1]).first()
                if bank_bin_queryset:
                    if bank_bin_queryset.status == 0:
                        bank_bin_queryset.update(status=1)
                        flash("Bankbin activated successfully!")
                        message=bank_bin_queryset.adminId.userName+" "+bank_bin_queryset.issuerName+" Bankbin activated successfully!"
                    elif bank_bin_queryset.status == 1:
                        bank_bin_queryset.update(status=0)
                        flash("Bankbin deactivated successfully!")
                        message=bank_bin_queryset.adminId.userName+" "+bank_bin_queryset.issuerName+" Bankbin deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_bank_bin_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))
    else:
        flash("Staff member does not have given status update bank bin permissions!!")
        return redirect(url_for("merchant_categories.get_bank_bin_list",redirectTo="Bankbin"))