from appservices.common.util import *

service_configurations = Blueprint("service_configurations",__name__)

###################category################
# Add category
@service_configurations.route("/add_category",methods=["POST","GET"])
def add_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            categoryName = request.form.get("categoryName","")
            serviceGroupingId = request.form.get("serviceGroupingId","")
            # transactionAPIId = request.form.get("transactionAPIId","")
            sorting = request.form.get("sorting","")
            displayInDashboard = request.form.get("displayInDashboard")
            isTpin = request.form.get("isTpin")
            image = request.files.get("image","")

            if categoryName:
                try:
                    category_table = Categories(
                        adminId=adminId,
                        categoryName = categoryName,
                        serviceGroupingId = serviceGroupingId,
                        transactionAPIId = None,
                        sorting = sorting,
                        # displayInDashboard = displayInDashboard,
                        # isTpin = isTpin,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = category_table.save()
                    categoryId = str(save_table.id)

                    if isTpin == None:
                        save_table.update(isTpin=False)
                    else:
                        save_table.update(isTpin=True)

                    if displayInDashboard == None:
                        save_table.update(displayInDashboard=False)
                    else:
                        save_table.update(displayInDashboard=True)

                    if image:       
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/categories/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/categories/"))
                        save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/categories/"+categoryId+".png"))
                        save_table.update(image="media/categories/"+categoryId+".png")

                    flash("Category saved successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
                except Exception as e:
                    flash("Unable to save fee distribution setting!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save category!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)


# View All Categories
@service_configurations.route("/service_configurations_list",methods=["POST","GET"])
def service_configurations_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    categoriesList = []
    servicesDropdownList = []
    servicesList = []
    walletsList = []
    taxTypesList = []
    statesList = []
    operatorsList = []
    operatorUpdateList = []
    operatorParametersList = []
    subParametersList = []
    operatorGroupingList = []
    serviceGroupingList = []
    serviceGroupingDropdownList = []
    transactionAPIsList = []
    activeOperatorParametersList = []
    hasSubOperatorParametersList = []
    subParameterGroupingsList = []
    operatorsDropdownList = []
    servicePagination = ""
    categoryPagination = ""
    operatorPagination = ""
    operatorparameterPagination = ""
    operatorupdatePagination = ""
    operatorgroupingPagination = ""
    servicegroupingPagination = ""
    subparameterPagination =""
    subparametergroupingPagination = ""
    
    adminId = session.get("adminId")
    try:
        redirectTo = request.args.get("redirectTo","ServiceGrouping")
        if redirectTo:
            redirectval = redirectTo
        else:
            redirectval = "ServiceGrouping" 
        search = False  
        search_element = request.args.get('search_element','')
        if search_element:
            search = True

         ######### categories list ############

        categories_queryset = Categories.objects(status__in=[0,1]).order_by("sorting")
        if search_element:
            categories_queryset = Categories.filter(Q(categoryName__icontains=search_element))
        # length = categories_queryset.count()
        # categories_queryset=categories_queryset[page_start:page_end]


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        categoriespage = request.args.get(get_page_parameter('categoriespage'), type=int, default=1)
        print(categoriespage,"categoriespage")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = categories_queryset.count()

        start = (categoriespage - 1) * per_page

        end = min(start + per_page, total_count)

        total_categories = categories_queryset[start:end]
        
        snoCount = start
        

        for each_category in total_categories:
            snoCount +=1
            category_dict = fetching_category_details(each_category)
            category_dict["snoCount"]=snoCount
            categoriesList.append(category_dict)

        categoryPagination = Pagination(categoriespage=categoriespage, total=total_count,page_parameter="categoriespage", per_page=per_page, alignment="right", record_name="category",href=domain+"api/super_admin/service_configurations_list?redirectTo=Category&categoriespage={0}")    

        ########### fetching services ############

        services_queryset = Service.objects(status__in=[0,1]).order_by("sorting")
        if search_element:
            services_queryset = Service.filter(Q(serviceName__icontains=search_element))
        # length = services_queryset.count()
        # services_queryset=services_queryset[page_start:page_end]

        # Get the current page from the query parameters
        #page = request.args.get(get_page_parameter(), type=int, default=1)
        servicepage = request.args.get(get_page_parameter('servicepage'), type=int, default=1)
        print(servicepage,"servicepage")
        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = services_queryset.count()

        start = (servicepage - 1) * per_page

        end = min(start + per_page, total_count)

        total_services = services_queryset[start:end]
        
        snoCount = start
        for each_service in total_services:
            snoCount +=1
            service_dict = fetching_service_details(each_service)
            service_dict["snoCount"]=snoCount
            servicesList.append(service_dict)

        for each_service in services_queryset:
            service_dict = fetching_service_details(each_service)
            servicesDropdownList.append(service_dict)

        # Pagination object for rendering pagination controls in the template
        # servicePagination = Pagination(page=servicepage, total=total_count, page_parameter="servicepage",per_page=per_page, alignment="right", record_name="Services")
        servicePagination = Pagination(servicepage=servicepage, total=total_count,page_parameter="servicepage",per_page=per_page, alignment="right", record_name="Services",href=domain+"api/super_admin/service_configurations_list?redirectTo=Service&servicepage={0}")
        

        ######### Operators list #############

        operators_queryset = Operators.objects(status__in=[0,1]).order_by('sorting')
        #if search_element:
        #    operators_queryset = Operators.filter(Q(operatorName__icontains=search_element))
        # length = operators_queryset.count()
        # operators_queryset=operators_queryset[page_start:page_end]

        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorpage = request.args.get(get_page_parameter('operatorpage'), type=int, default=1)
        print(operatorpage,"operatorpage")

        operatorper_page = 20 # Number of items per page

        # Query the database for the current page's data
        total_operators_count = operators_queryset.count()

        operatorstart = (operatorpage - 1) * operatorper_page

        operatorend = min(operatorstart + operatorper_page, total_operators_count)

        total_operators = operators_queryset[operatorstart:operatorend]
        
        operatorSnoCount = operatorstart

        for each_operator in total_operators:
            operatorSnoCount +=1
            operator_dict = fetching_operator_details(each_operator)
            operator_dict["operatorSnoCount"]=operatorSnoCount
            operatorsList.append(operator_dict)

        for each_operator in operators_queryset:
            operator_dict = fetching_operator_details(each_operator)
            operatorsDropdownList.append(operator_dict)

        operatorPagination = Pagination(operatorpage=operatorpage, total=total_operators_count, page_parameter="operatorpage",per_page=operatorper_page, alignment="right", record_name="operators",href=domain+"api/super_admin/service_configurations_list?redirectTo=Operator&operatorpage={0}")    

        ############ Operator update list ##########

        operators_update_queryset = OperatorUpdate.objects(status__in=[0,1]).order_by('-id')
        # if search_element:
        #     operators_update_queryset = OperatorUpdate.filter(Q(apiOperatorCode1__icontains=search_element))
        # length = operators_update_queryset.count()
        # operators_update_queryset=operators_update_queryset[page_start:page_end]

        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorupdatepage = request.args.get(get_page_parameter('operatorupdatepage'), type=int, default=1)
        print(operatorupdatepage,"operatorupdatepage")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = operators_update_queryset.count()

        start = (operatorupdatepage - 1) * per_page

        end = min(start + per_page, total_count)

        total_operatorsupdate = operators_update_queryset[start:end]
        
        snoCount = start

        for each_operator_update in total_operatorsupdate:
            snoCount +=1
            operator_update_dict = fetching_operator_update_details(each_operator_update)
            operator_update_dict["snoCount"]=snoCount
            operatorUpdateList.append(operator_update_dict)

        operatorupdatePagination = Pagination(operatorupdatepage=operatorupdatepage, total=total_count, page_parameter="operatorupdatepage", per_page=per_page, alignment="right", record_name="operatorsupdate",href=domain+"api/super_admin/service_configurations_list?redirectTo=OperatorUpdate&operatorupdatepage={0}")        

        ############# Operator Parameters list ############
        operator_parameters_queryset = OperatorParameter.objects(status__in=[0,1]).order_by('sort')
        #if search_element:
        #    operator_parameters_queryset = OperatorParameter.filter(Q(parameterName__icontains=search_element))
        # length = operator_parameters_queryset.count()
        # operator_parameters_queryset=operator_parameters_queryset[page_start:page_end]

        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorparameter = request.args.get(get_page_parameter('operatorparameter'), type=int, default=1)
        print(operatorparameter,"operatorparameter")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = operator_parameters_queryset.count()

        start = (operatorparameter - 1) * per_page

        end = min(start + per_page, total_count)

        total_operatorparameter = operator_parameters_queryset[start:end]
        
        snoCount = start

        for each_operator_parameter in total_operatorparameter:
            snoCount +=1
            operator_parameter_dict = fetching_operator_parameter_details(each_operator_parameter)
            operator_parameter_dict["snoCount"]=snoCount
            operatorParametersList.append(operator_parameter_dict)

        operatorparameterPagination = Pagination(operatorparameter=operatorparameter, total=total_count,page_parameter="operatorparameter", per_page=per_page, alignment="right", record_name="operatorparameter",href=domain+"api/super_admin/service_configurations_list?redirectTo=OperatorParameter&operatorparameter={0}")     

        ########## Operator Grouping list ##############
        activeOperatorParametersList=fetching_has_grouping_operator_parameter_details()
        operators_grouping_queryset = OperatorGrouping.objects(status__in=[0,1]).order_by('-id')
        if search_element:
            operators_grouping_queryset = OperatorGrouping.filter(Q(name__icontains=search_element))
        # length = operators_grouping_queryset.count()
        # operators_grouping_queryset=operators_grouping_queryset[page_start:page_end]


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        operatorgrouping = request.args.get(get_page_parameter('operatorgrouping'), type=int, default=1)
        print(operatorgrouping,"operatorgrouping")


        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = operators_grouping_queryset.count()

        start = (operatorgrouping - 1) * per_page

        end = min(start + per_page, total_count)

        total_operatorgrouping = operators_grouping_queryset[start:end]
        
        snoCount = start

        for each_operator_grouping in total_operatorgrouping:
            snoCount +=1
            operator_grouping_dict = fetching_operator_grouping_details(each_operator_grouping)
            operator_grouping_dict["snoCount"]=snoCount
            operatorGroupingList.append(operator_grouping_dict)

        operatorgroupingPagination = Pagination(operatorgrouping=operatorgrouping, total=total_count,page_parameter="operatorgrouping", per_page=per_page, alignment="right", record_name="operatorgrouping",href=domain+"api/super_admin/service_configurations_list?redirectTo=OperatorGrouping&operatorgrouping={0}")

        ########## Service Grouping list ##############
        service_grouping_queryset = ServiceGrouping.objects(status__in=[0,1]).order_by('sorting')
        if search_element:
            service_grouping_queryset = ServiceGrouping.filter(Q(name__icontains=search_element))
        # length = service_grouping_queryset.count()
        # service_grouping_queryset=service_grouping_queryset[page_start:page_end]

       # page = request.args.get(get_page_parameter(), type=int, default=1)
        servicegrouping = request.args.get(get_page_parameter('servicegrouping'), type=int, default=1)
        print(servicegrouping,"servicegrouping")

        per_page = 20  # Number of items per page

        # Query the database for the current page's data
        total_count = service_grouping_queryset.count()

        start = (servicegrouping - 1) * per_page

        end = min(start + per_page, total_count)

        total_servicegrouping = service_grouping_queryset[start:end]
        
        snoCount = start

        for each_service_grouping in total_servicegrouping:
            snoCount +=1
            service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
            service_grouping_dict["snoCount"]=snoCount
            serviceGroupingList.append(service_grouping_dict)

        for each_service_grouping in service_grouping_queryset:
            service_grouping_dict = fetching_service_grouping_details(each_service_grouping)
            serviceGroupingDropdownList.append(service_grouping_dict)

        servicegroupingPagination = Pagination(servicegrouping=servicegrouping, total=total_count,page_parameter="servicegrouping", per_page=per_page, alignment="right", record_name="servicegrouping",href=domain+"api/super_admin/service_configurations_list?redirectTo=ServiceGrouping&servicegrouping={0}")    

        ############# Sub Parameters list ############
        hasSubOperatorParametersList=fetching_has_sub_operator_parameter_details()
        sub_parameters_queryset = SubParameters.objects(status__in=[0,1]).order_by('sort')
        # if search_element:
        #     operator_parameters_queryset = OperatorParameter.filter(Q(parameterName__icontains=search_element))
        # # length = operator_parameters_queryset.count()
        # # operator_parameters_queryset=operator_parameters_queryset[page_start:page_end]


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        subparameterpage = request.args.get(get_page_parameter('subparameterpage'), type=int, default=1)
        print(subparameterpage,"subparameterpage")

        per_page = 5 # Number of items per page

        # Query the database for the current page's data
        total_count = sub_parameters_queryset.count()

        start = (subparameterpage - 1) * per_page

        end = min(start + per_page, total_count)

        total_subparameter = sub_parameters_queryset[start:end]
        
        snoCount = start

        for each_sub_parameter in total_subparameter:
            snoCount +=1
            sub_parameter_dict = fetching_sub_parameter_details(each_sub_parameter)
            sub_parameter_dict["snoCount"]=snoCount
            subParametersList.append(sub_parameter_dict)

        subparameterPagination = Pagination(subparameterpage=subparameterpage, total=total_count,page_parameter="subparameterpage",  per_page=per_page, alignment="right", record_name="subparameter",href=domain+"api/super_admin/service_configurations_list?redirectTo=SubParameter&subparameterpage={0}")  

         ############# Sub Parameters Grouping list ############  

        sub_parameter_grouping_queryset = SubParameterGrouping.objects(status__in=[0,1]).order_by("-id").all()


        #page = request.args.get(get_page_parameter(), type=int, default=1)
        subparametergroupingpage = request.args.get(get_page_parameter('subparametergroupingpage'), type=int, default=1)
        print(subparametergroupingpage,"subparametergroupingpage")

        subparametergroupingper_page = 20 # Number of items per page

        # Query the database for the current page's data
        total_subparametergrouping_count = sub_parameter_grouping_queryset.count()

        start_subparametergrouping = (subparametergroupingpage - 1) * subparametergroupingper_page

        end_subparametergrouping = min(start_subparametergrouping + subparametergroupingper_page, total_subparametergrouping_count)

        total_subparametergrouping = sub_parameter_grouping_queryset[start_subparametergrouping:end_subparametergrouping]
        
        subparametergroupingsnoCount = start_subparametergrouping

        for each_sub_parameter_grouping in total_subparametergrouping:
            subparametergroupingsnoCount +=1
            sub_parameter_grouping_dict = fetching_sub_parameter_grouping_details(each_sub_parameter_grouping)
            sub_parameter_grouping_dict["snoCount"]=subparametergroupingsnoCount
            subParameterGroupingsList.append(sub_parameter_grouping_dict)


        subparametergroupingPagination = Pagination(page=subparametergroupingpage, total=total_subparametergrouping_count,page_parameter="subparametergroupingpage", per_page=subparametergroupingper_page, alignment="right", record_name="subparametergrouping",href=domain+"api/super_admin/service_configurations_list?redirectTo=SubParameterGrouping&subparametergroupingpage={0}") 

        ############ wallets list ############
        ############ tax types list ############
        ############ states list ############
        ############ transactionAPI list ############
        walletsList = fetching_wallet_details()
        taxTypesList = fetching_tax_type_details()
        statesList = fetching_state_details()

        transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id')
        for each_transaction_api in transaction_API_queryset:
            transaction_api_dict = {
            "id":str(each_transaction_api.id),
            "apiName":each_transaction_api.apiName
            }
            transactionAPIsList.append(transaction_api_dict)

        print(transactionAPIsList,"((((((((((transactionAPIsList))))))))))")
        # pagination = Pagination(
        #     page=page,
        #     total=length,
        #     found=length,
        #     record_name='categories',
        #     per_page=10,
        #     alignment="right"
        #     )


        return render_template("super_admin_templates/service_configurations_list.html",
            subparametergroupingPagination =subparametergroupingPagination,
            subparameterPagination = subparameterPagination,
            servicegroupingPagination=servicegroupingPagination,
            operatorgroupingPagination=operatorgroupingPagination,
            operatorupdatePagination=operatorupdatePagination,
            operatorparameterPagination=operatorparameterPagination,
            operatorPagination=operatorPagination,
            categoryPagination=categoryPagination,
            servicePagination=servicePagination,
            categoriesList=categoriesList,
            servicesList=servicesList,
            servicesDropdownList=servicesDropdownList,
            taxTypesList=taxTypesList,
            operatorsList=operatorsList,
            operatorUpdateList=operatorUpdateList,
            operatorParametersList=operatorParametersList,
            subParametersList=subParametersList,
            operatorGroupingList=operatorGroupingList,
            serviceGroupingList=serviceGroupingList,
            serviceGroupingDropdownList=serviceGroupingDropdownList,
            transactionAPIsList=transactionAPIsList,
            activeOperatorParametersList=activeOperatorParametersList,
            hasSubOperatorParametersList=hasSubOperatorParametersList,
            subParameterGroupingsList=subParameterGroupingsList,
            statesList=statesList,
            walletsList=walletsList,
            search_element=search_element,
            redirectval=redirectval,
            operatorsDropdownList=operatorsDropdownList,
            # pagination=pagination,
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch categories details!!"
        return render_template("super_admin_templates/service_configurations_list.html",
            subparametergroupingPagination = subparametergroupingPagination,
            subparameterPagination = subparameterPagination,
            servicegroupingPagination=servicegroupingPagination,
            operatorgroupingPagination=operatorgroupingPagination,
            operatorupdatePagination=operatorupdatePagination,
            operatorparameterPagination=operatorparameterPagination,
            operatorPagination=operatorPagination,
            categoryPagination=categoryPagination,
            servicePagination=servicePagination,
            categoriesList=categoriesList,
            servicesList=servicesList,
            servicesDropdownList=servicesDropdownList,
            taxTypesList=taxTypesList,
            operatorsList=operatorsList,
            operatorUpdateList=operatorUpdateList,
            operatorParametersList=operatorParametersList,
            subParametersList=subParametersList,
            operatorGroupingList=operatorGroupingList,
            serviceGroupingList=serviceGroupingList,
            serviceGroupingDropdownList=serviceGroupingDropdownList,
            transactionAPIsList=transactionAPIsList,
            activeOperatorParametersList=activeOperatorParametersList,
            hasSubOperatorParametersList=hasSubOperatorParametersList,
            statesList=statesList,
            walletsList=walletsList,
            search_element=search_element,
            redirectval = redirectval,
            operatorsDropdownList = operatorsDropdownList,
            # pagination=pagination,
            )

# Update category status
@service_configurations.route("/update_category_status",methods=["POST","GET"])
def update_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    categoryId = request.args.get("categoryId","")

    if categoryId:
        try:
            category_queryset = Categories.objects(id=categoryId,status__nin=[2]).first()
            if category_queryset:
                if category_queryset.status == 0:
                    category_queryset.update(status=1)
                    flash("Category activated successfully!")
                elif category_queryset.status == 1:
                    category_queryset.update(status=0)
                    flash("Category deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
    else:
        return redirect(url_for("service_configurations.service_configurations_list"))



# Update category
@service_configurations.route("/update_category",methods=["POST","GET"])
def update_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        categoryId = request.args.get("categoryId","")
        if request.method == "POST":
            categoryName = request.form.get("categoryName","")
            serviceGroupingId = request.form.get("serviceGroupingId","")
            # transactionAPIId = request.form.get("transactionAPIId","")
            sorting = request.form.get("sorting","")
            displayInDashboard = request.form.get("displayInDashboard")
            isTpin = request.form.get("isTpin")
            image = request.files.get("image","")

            print(request.form)
            print(displayInDashboard)
            print("((((((((((((((((((((((((displayInDashboard))))))))))))))))))))))))")
            category_queryset = Categories.objects(id=categoryId).first()
            if category_queryset:
                category_queryset.update(
                    categoryName=categoryName,
                    sorting=sorting,
                    serviceGroupingId=ObjectId(serviceGroupingId),
                    transactionAPIId=None,
                    # isTpin=isTpin,
                    )
                if isTpin == None:
                    category_queryset.update(isTpin=False)
                else:
                    category_queryset.update(isTpin=True)

                if displayInDashboard == None:
                    category_queryset.update(displayInDashboard=False)
                else:
                    category_queryset.update(displayInDashboard=True)

                if image:       
                    if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/categories/")):
                        os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/categories/"))
                    save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/categories/"+categoryId+".png"))
                    category_queryset.update(image="media/categories/"+categoryId+".png")
                flash("Category updated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update category!!"
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))


# Delete Category
@service_configurations.route("/delete_category",methods=["GET"])
def delete_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            categoryId = request.args.get("categoryId","")
            category_queryset = Categories.objects(id=categoryId,status__in=[0,1]).first()
            category_queryset.update(status=2)
            flash("Category deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete category!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Category"))


############# Service API's ################

# Add Service
@service_configurations.route("/add_service",methods=["POST","GET"])
def add_service():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            serviceName = request.form.get("serviceName","")
            serviceType = request.form.get("serviceType","")
            walletId = request.form.get("walletId","")
            categoryId = request.form.get("categoryId","")
            serviceGroupingId = request.form.get("serviceGroupingId","")
            # transactionAPIId = request.form.get("transactionAPIId","")
            code = request.form.get("code","")
            sorting = request.form.get("sorting","")
            displayInDashboard = request.form.get("displayInDashboard")
            isService = request.form.get("isService")
            isbbps = request.form.get("isbbps")
            isOperatorWise = request.form.get("isOperatorWise")
            file = request.files.get("file","")

            if serviceName and serviceType and walletId and categoryId and code :
                try:
                    service_table = Service(
                        adminId = adminId,
                        serviceName = serviceName,
                        serviceType = serviceType,
                        walletId = walletId,
                        categoryId = categoryId,
                        serviceGroupingId = serviceGroupingId,
                        transactionAPIId = None,
                        code = code,
                        sorting = sorting,
                        # displayInDashboard = displayInDashboard,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = service_table.save()
                    serviceId = str(save_table.id)

                    if isService == None:
                        save_table.update(isService=False)
                    else:
                        save_table.update(isService=True)
                    if isbbps == None:
                        save_table.update(isbbps=False)
                    else:
                        save_table.update(isbbps=True)
                    if isOperatorWise == None:
                        save_table.update(isOperatorWise=False)
                    else:
                        save_table.update(isOperatorWise=True)

                    if displayInDashboard == None:
                        save_table.update(displayInDashboard=False)
                    else:
                        save_table.update(displayInDashboard=True)

                    if file:       
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/services/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/services/"))
                        save_file = file.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                        save_table.update(file="media/services/"+serviceId+".png")

                    flash("New service saved successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
                except Exception as e:
                    flash("Unable to save service!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save service!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)

#Update Service
@service_configurations.route("/update_service",methods=["POST","GET"])
def update_service():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        serviceId = request.args.get("serviceId","")
        if request.method == "POST":
            serviceName = request.form.get("serviceName","")
            serviceType = request.form.get("serviceType","")
            walletId = request.form.get("walletId","")
            categoryId = request.form.get("categoryId","")
            serviceGroupingId = request.form.get("serviceGroupingId","")
            # transactionAPIId = request.form.get("transactionAPIId","")
            code = request.form.get("code","")
            sorting = request.form.get("sorting")
            displayInDashboard = request.form.get("displayInDashboard")
            isService = request.form.get("isService")
            isbbps = request.form.get("isbbps")
            isOperatorWise = request.form.get("isOperatorWise")
            file = request.files.get("file","")

            if serviceName and serviceType and walletId and categoryId and code :
                try:

                    service_queryset = Service.objects(id=serviceId).first()
                    if service_queryset:
                        service_queryset.update(
                            serviceName = serviceName,
                            serviceType = serviceType,
                            walletId = ObjectId(walletId),
                            categoryId = ObjectId(categoryId),
                            serviceGroupingId = ObjectId(serviceGroupingId),
                            transactionAPIId = None,
                            code = code,
                            sorting = sorting,
                            # displayInDashboard = displayInDashboard,
                            )
                        if isService == None:
                            service_queryset.update(isService=False)
                        else:
                            service_queryset.update(isService=True)

                        if isbbps == None:
                            service_queryset.update(isbbps=False)
                        else:
                            service_queryset.update(isbbps=True)

                        if isOperatorWise == None:
                            service_queryset.update(isOperatorWise=False)
                        else:
                            service_queryset.update(isOperatorWise=True)

                        if displayInDashboard == None:
                            service_queryset.update(displayInDashboard=False)
                        else:
                            service_queryset.update(displayInDashboard=True)

                        if file:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/services/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/services/"))
                            save_file = file.save(os.path.join(app.config['SITE_ROOT'], "media/services/"+serviceId+".png"))
                            service_queryset.update(file="media/services/"+serviceId+".png")
                        flash("Service updated successfully!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    flash("Unable to update service!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update service!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))

# Update service status
@service_configurations.route("/update_service_status",methods=["POST","GET"])
def update_service_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    serviceId = request.args.get("serviceId","")
    if serviceId:
        try:
            service_queryset = Service.objects(id=serviceId,status__nin=[2]).first()
            if service_queryset:
                if service_queryset.status == 0:
                    service_queryset.update(status=1)
                    flash("Service activated successfully!")
                elif service_queryset.status == 1:
                    service_queryset.update(status=0)
                    flash("Service deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
    else:
        return redirect(url_for("service_configurations.service_configurations_list"))

# Delete service
@service_configurations.route("/delete_service",methods=["GET","POST"])
def delete_service():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            serviceId = request.args.get("serviceId","")
            service_queryset = Service.objects(id=serviceId,status__in=[0,1]).first()
            service_queryset.update(status=2)
            flash("Service deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete service!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Service"))




############# Operator API's ################

# Add operator
@service_configurations.route("/add_operator",methods=["POST","GET"])
def add_operator():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            operatorName = request.form.get("operatorName","")
            serviceId = request.form.get("serviceId","")
            allowType = request.form.get("allowType","")
            taxTypeId = request.form.get("taxTypeId","")
            serviceGroupingId = request.form.get("serviceGroupingId","")
            transactionAPIId = request.form.get("transactionAPIId","")
            amountPlans = request.form.get("amountPlans","")
            rejectedAmount = request.form.get("rejectedAmount","")
            minLength = request.form.get("minLength","")
            maxLength = request.form.get("maxLength","")
            minAmount = request.form.get("minAmount","")
            maxAmount = request.form.get("maxAmount","")
            apiType = request.form.get("apiType","")
            apiCode = request.form.get("apiCode","")
            stateId = request.form.get("stateId","")
            sorting = request.form.get("sorting","")
            image = request.files.get("image","")
            displayInDashboard = request.form.get("displayInDashboard")
            isBbps = request.form.get("isBbps")
            isValidate = request.form.get("isValidate")
            isPortial = request.form.get("isPortial")
            isRandom = request.form.get("isRandom")
            payWithoutFetchAllowed = request.form.get("payWithoutFetchAllowed")

            if operatorName and taxTypeId:
                try:
                    operator_table = Operators(
                        adminId = adminId,
                        operatorName = operatorName,
                        serviceId = serviceId,
                        allowType = allowType,
                        taxTypeId = taxTypeId,
                        serviceGroupingId = serviceGroupingId,
                        transactionAPIId = transactionAPIId,
                        amountPlans = amountPlans,
                        rejectedAmount = rejectedAmount,
                        minLength = minLength,
                        maxLength = maxLength,
                        minAmount = minAmount,
                        maxAmount = maxAmount,
                        apiType = apiType,
                        apiCode = apiCode,
                        stateId = stateId,
                        sorting = sorting,
                        # displayInDashboard = displayInDashboard,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = operator_table.save()
                    operatorId = str(save_table.id)

                    if isBbps == None:
                        save_table.update(isBbps=False)
                    else:
                        save_table.update(isBbps=True)
                    if isValidate == None:
                        save_table.update(isValidate=False)
                    else:
                        save_table.update(isValidate=True)
                    if isPortial == None:
                        save_table.update(isPortial=False)
                    else:
                        save_table.update(isPortial=True)
                    if isRandom == None:
                        save_table.update(isRandom=False)
                    else:
                        save_table.update(isRandom=True)

                    if displayInDashboard == None:
                        save_table.update(displayInDashboard=False)
                    else:
                        save_table.update(displayInDashboard=True)

                    if payWithoutFetchAllowed == None:
                        save_table.update(payWithoutFetchAllowed=False)
                    else:
                        save_table.update(payWithoutFetchAllowed=True)

                    if image:       
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/operators/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/operators/"))
                        save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/operators/"+operatorId+".png"))
                        save_table.update(image="media/operators/"+operatorId+".png")
                    flash("Operator added successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    flash("Unable to add operator!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)

# Update operator
@service_configurations.route("/update_operator",methods=["POST","GET"])
def update_operator():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        operatorId = request.args.get("operatorId","")
        if request.method == "POST":
            operatorName = request.form.get("operatorName","")
            serviceId = request.form.get("serviceId","")
            allowType = request.form.get("allowType","")
            taxTypeId = request.form.get("taxTypeId","")
            serviceGroupingId = request.form.get("serviceGroupingId","")
            transactionAPIId = request.form.get("transactionAPIId","")
            amountPlans = request.form.get("amountPlans","")
            rejectedAmount = request.form.get("rejectedAmount","")
            minLength = request.form.get("minLength","")
            maxLength = request.form.get("maxLength","")
            minAmount = request.form.get("minAmount","")
            maxAmount = request.form.get("maxAmount","")
            apiType = request.form.get("apiType","")
            apiCode = request.form.get("apiCode","")
            stateId = request.form.get("stateId","")
            sorting = request.form.get("sorting","")
            image = request.files.get("image","")
            displayInDashboard = request.form.get("displayInDashboard")
            isBbps = request.form.get("isBbps")
            isValidate = request.form.get("isValidate")
            isPortial = request.form.get("isPortial")
            isRandom = request.form.get("isRandom")
            payWithoutFetchAllowed = request.form.get("payWithoutFetchAllowed")

            if operatorId and operatorName and taxTypeId:
                operator_queryset = Operators.objects(id=operatorId).first()
                if operator_queryset:
                        operator_queryset.update(
                            operatorName = operatorName,
                            serviceId = ObjectId(serviceId),
                            allowType = allowType,
                            taxTypeId = ObjectId(taxTypeId),
                            serviceGroupingId = ObjectId(serviceGroupingId),
                            transactionAPIId = ObjectId(transactionAPIId),
                            amountPlans = amountPlans,
                            rejectedAmount = rejectedAmount,
                            minLength = minLength,
                            maxLength = maxLength,
                            minAmount = minAmount,
                            maxAmount = maxAmount,
                            apiCode = apiCode,
                            apiType = apiType,
                            sorting = sorting,
                            # displayInDashboard = displayInDashboard,
                            stateId = ObjectId(stateId),
                            )
                        if isBbps == None:
                            operator_queryset.update(isBbps=False)
                        else:
                            operator_queryset.update(isBbps=True)
                        if isValidate == None:
                            operator_queryset.update(isValidate=False)
                        else:
                            operator_queryset.update(isValidate=True)
                        if isPortial == None:
                            operator_queryset.update(isPortial=False)
                        else:
                            operator_queryset.update(isPortial=True)
                        if isRandom == None:
                            operator_queryset.update(isRandom=False)
                        else:
                            operator_queryset.update(isRandom=True)

                        if displayInDashboard == None:
                            operator_queryset.update(displayInDashboard=False)
                        else:
                            operator_queryset.update(displayInDashboard=True)

                        if payWithoutFetchAllowed == None:
                            operator_queryset.update(payWithoutFetchAllowed=False)
                        else:
                            operator_queryset.update(payWithoutFetchAllowed=True)

                        if image:       
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/operators/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/operators/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/operators/"+operatorId+".png"))
                            operator_queryset.update(image="media/operators/"+operatorId+".png")
                        flash("Operator updated successfully!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
                else:
                    flash("Invaild operator id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update operator!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))

# Update operator status
@service_configurations.route("/update_operator_status",methods=["POST","GET"])
def update_operator_status():
    print("its calling")
    if not session.get("adminId"):
        return redirect("admin_login")
    print(session.get("adminId"))
    operatorId = request.args.get("operatorId","")
    if operatorId:
        print(operatorId)
        try:
            operator_queryset = Operators.objects(id=operatorId,status__nin=[2]).first()
            if operator_queryset:
                print(operator_queryset.status)
                if operator_queryset.status == 0:
                    operator_queryset.update(status=1)
                    flash("Operator activated successfully!")
                    print(operator_queryset.status)
                elif operator_queryset.status == 1:
                    operator_queryset.update(status=0)
                    print(operator_queryset.status)
                    flash("Operator deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
    else:
        return redirect(url_for("service_configurations.service_configurations_list"))

# Delete operator
@service_configurations.route("/delete_operator",methods=["GET","POST"])
def delete_operator():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            operatorId = request.args.get("operatorId","")
            operator_queryset = Operators.objects(id=operatorId,status__in=[0,1]).first()
            operator_queryset.update(status=2)
            flash("Operator deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="Operator"))



########### Operator Update ##############
# Add operator
@service_configurations.route("/add_operator_update",methods=["POST","GET"])
def add_operator_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            operatorId = request.form.get("operatorId","")
            apiOperatorCode1 = request.form.get("apiOperatorCode1","")
            apiOperatorCode2 = request.form.get("apiOperatorCode2","")
            apiOperatorCode3 = request.form.get("apiOperatorCode3","")
            apiOperatorCode4 = request.form.get("apiOperatorCode4","")
            apiOperatorCode5 = request.form.get("apiOperatorCode5","")
            apiOperatorCode6 = request.form.get("apiOperatorCode6","")

            if operatorId and apiOperatorCode1:
                try:
                    operator_update_table = OperatorUpdate(
                        adminId = adminId,
                        operatorId = operatorId,
                        apiOperatorCode1 = apiOperatorCode1,
                        apiOperatorCode2 = apiOperatorCode2,
                        apiOperatorCode3 = apiOperatorCode3,
                        apiOperatorCode4 = apiOperatorCode4,
                        apiOperatorCode5 = apiOperatorCode5,
                        apiOperatorCode6 = apiOperatorCode6,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = operator_update_table.save()
                    operatorUpdateId = str(save_table.id)

                    flash("Operator update added successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    flash("Unable to add operator update!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator update!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)


def fetching_operator_update_details(operator_update_queryset):
    operator_update_dict = {}
    try:
        operator_update_dict={
        "id":str(operator_update_queryset.id),
        "operatorId":str(operator_update_queryset.operatorId.id),
        "operatorName":operator_update_queryset.operatorId.operatorName,
        "apiOperatorCode1":operator_update_queryset.apiOperatorCode1,
        "apiOperatorCode2":operator_update_queryset.apiOperatorCode2,
        "apiOperatorCode3":operator_update_queryset.apiOperatorCode3,
        "apiOperatorCode4":operator_update_queryset.apiOperatorCode4,
        "apiOperatorCode5":operator_update_queryset.apiOperatorCode5,
        "apiOperatorCode6":operator_update_queryset.apiOperatorCode6,
        "status":operator_update_queryset.status,
        }

        if operator_update_queryset.status==1:
            operator_update_dict["actionText"] = "Active"
        else:
            operator_update_dict["actionText"] = "Deactive"

        if operator_update_queryset.createdOn:
            operator_update_dict["createdOn"] = operator_update_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            operator_update_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return operator_update_dict


# Update operator update
@service_configurations.route("/update_operator_update",methods=["POST","GET"])
def update_operator_update():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        operatorUpdateId = request.args.get("operatorUpdateId","")
        if request.method == "POST":
            operatorId = request.form.get("operatorId","")
            apiOperatorCode1 = request.form.get("apiOperatorCode1","")
            apiOperatorCode2 = request.form.get("apiOperatorCode2","")
            apiOperatorCode3 = request.form.get("apiOperatorCode3","")
            apiOperatorCode4 = request.form.get("apiOperatorCode4","")
            apiOperatorCode5 = request.form.get("apiOperatorCode5","")
            apiOperatorCode6 = request.form.get("apiOperatorCode6","")

            if operatorUpdateId and operatorId and apiOperatorCode1:
                operator_update_queryset = OperatorUpdate.objects(id=operatorUpdateId).first()
                if operator_update_queryset:
                        operator_update_queryset.update(
                            operatorId = ObjectId(operatorId),
                            apiOperatorCode1 = apiOperatorCode1,
                            apiOperatorCode2 = apiOperatorCode2,
                            apiOperatorCode3 = apiOperatorCode3,
                            apiOperatorCode4 = apiOperatorCode4,
                            apiOperatorCode5 = apiOperatorCode5,
                            apiOperatorCode6 = apiOperatorCode6,
                            )
                        flash("Operator update updated successfully!")
                        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
                else:
                    flash("Invaild operator update id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update operator update!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))



# Update operator update status
@service_configurations.route("/update_operator_update_status",methods=["POST","GET"])
def update_operator_update_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorUpdateId = request.args.get("operatorUpdateId","")
    if operatorUpdateId:
        try:
            operator_update_queryset = OperatorUpdate.objects(id=operatorUpdateId,status__nin=[2]).first()
            if operator_update_queryset:
                print(operator_update_queryset.status)
                if operator_update_queryset.status == 0:
                    operator_update_queryset.update(status=1)
                    flash("Operator update activated successfully!")
                    print(operator_update_queryset.status)
                elif operator_update_queryset.status == 1:
                    operator_update_queryset.update(status=0)
                    print(operator_update_queryset.status)
                    flash("Operator update deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    else:
        return redirect(url_for("service_configurations.service_configurations_list"))

# Delete operator
@service_configurations.route("/delete_operator_update",methods=["GET","POST"])
def delete_operator_update():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            operatorUpdateId = request.args.get("operatorUpdateId","")
            operator_update_queryset = OperatorUpdate.objects(id=operatorUpdateId,status__in=[0,1]).first()
            operator_update_queryset.update(status=2)
            flash("Operator update deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorUpdate"))


########### Operator Parameter ##############
# Add operator parameter
@service_configurations.route("/add_operator_parameter",methods=["POST","GET"])
def add_operator_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            parameterName = request.form.get("parameterName","")
            displayName = request.form.get("displayName","")
            operatorId = request.form.get("operatorId","")
            minLength = request.form.get("minLength")
            maxLength = request.form.get("maxLength")
            sort = request.form.get("sort")
            # manualSort = request.form.get("manualSort")
            fieldType = request.form.get("fieldType","")
            pattern = request.form.get("pattern","")
            apiCode = request.form.get("apiCode","")
            transactionAPIId = request.form.get("transactionAPIId","")
            isActive = request.form.get("isActive")
            isReferenceKey = request.form.get("isReferenceKey")
            isMandatory = request.form.get("isMandatory")
            hasGrouping = request.form.get("hasGrouping")
            hasApiCall = request.form.get("hasApiCall")
            hasSubParameters = request.form.get("hasSubParameters")
            hasIncludeApiCall = request.form.get("hasIncludeApiCall")
            apiCall = request.form.get("apiCall","")

            if parameterName and operatorId and minLength and maxLength and sort and fieldType:
                try:
                    operator_parameter_table = OperatorParameter(
                        adminId = adminId,
                        parameterName = parameterName,
                        displayName = displayName,
                        operatorId = operatorId,
                        minLength = minLength,
                        maxLength = maxLength,
                        sort = sort,
                        # manualSort = manualSort,
                        fieldType = fieldType,
                        pattern = pattern,
                        apiCode = apiCode,
                        apiCall =apiCall,
                        transactionAPIId = transactionAPIId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = operator_parameter_table.save()
                    operatorParameterId = str(save_table.id)


                    if isActive == None:
                        save_table.update(isActive=False)
                    else:
                        save_table.update(isActive=True)

                    if hasIncludeApiCall == None:
                        save_table.update(hasIncludeApiCall=False)
                    else:
                        save_table.update(hasIncludeApiCall=True)

                    if isMandatory == None:
                        save_table.update(isMandatory=False)
                    else:
                        save_table.update(isMandatory=True)

                    if isReferenceKey == None:
                        save_table.update(isReferenceKey=False)
                    else:
                        save_table.update(isReferenceKey=True)

                    if hasGrouping == None:
                        save_table.update(hasGrouping=False)
                    else:
                        save_table.update(hasGrouping=True)

                    if hasApiCall == None:
                        save_table.update(hasApiCall=False)
                    else:
                        save_table.update(hasApiCall=True)

                    if hasSubParameters == None:
                        save_table.update(hasSubParameters=False)
                    else:
                        save_table.update(hasSubParameters=True)

                    flash("Operator parameter added successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    flash("Unable to add operator parameter!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator parameter!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)



# Update operator parameter
@service_configurations.route("/update_operator_parameter",methods=["POST","GET"])
def update_operator_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        operatorParameterId = request.args.get("operatorParameterId","")
        if request.method == "POST":
            parameterName = request.form.get("parameterName","")
            displayName = request.form.get("displayName","")
            operatorId = request.form.get("operatorId","")
            minLength = request.form.get("minLength")
            maxLength = request.form.get("maxLength")
            sort = request.form.get("sort")
            # manualSort = request.form.get("manualSort")
            fieldType = request.form.get("fieldType","")
            pattern = request.form.get("pattern","")
            apiCode = request.form.get("apiCode","")
            transactionAPIId = request.form.get("transactionAPIId","")
            isActive = request.form.get("isActive")
            isMandatory = request.form.get("isMandatory")
            isReferenceKey = request.form.get("isReferenceKey")
            hasGrouping = request.form.get("hasGrouping")
            hasApiCall = request.form.get("hasApiCall")
            hasIncludeApiCall = request.form.get("hasIncludeApiCall")
            hasSubParameters = request.form.get("hasSubParameters")
            apiCall = request.form.get("apiCall","")

            if operatorParameterId and parameterName and displayName and operatorId and minLength and maxLength and sort and fieldType:
                operator_parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__nin=[2]).first()
                if operator_parameter_queryset:
                    operator_parameter_queryset.update(
                        parameterName = parameterName,
                        displayName = displayName,
                        operatorId = ObjectId(operatorId),
                        minLength = minLength,
                        maxLength = maxLength,
                        sort = sort,
                        # manualSort = manualSort,
                        fieldType = fieldType,
                        pattern = pattern,
                        apiCode = apiCode,
                        transactionAPIId = ObjectId(transactionAPIId),
                        apiCall = apiCall,
                        )
                    if isActive == None:
                        operator_parameter_queryset.update(isActive=False)
                    else:
                        operator_parameter_queryset.update(isActive=True)

                    if hasIncludeApiCall == None:
                        operator_parameter_queryset.update(hasIncludeApiCall=False)
                    else:
                        operator_parameter_queryset.update(hasIncludeApiCall=True)

                    if isMandatory == None:
                        operator_parameter_queryset.update(isMandatory=False)
                    else:
                        operator_parameter_queryset.update(isMandatory=True)

                    if isReferenceKey == None:
                        operator_parameter_queryset.update(isReferenceKey=False)
                    else:
                        operator_parameter_queryset.update(isReferenceKey=True)

                    if hasGrouping == None:
                        operator_parameter_queryset.update(hasGrouping=False)
                    else:
                        operator_parameter_queryset.update(hasGrouping=True)
                    if hasApiCall == None:
                        operator_parameter_queryset.update(hasApiCall=False)
                    else:
                        operator_parameter_queryset.update(hasApiCall=True)
                    if hasSubParameters == None:
                        operator_parameter_queryset.update(hasSubParameters=False)
                    else:
                        operator_parameter_queryset.update(hasSubParameters=True)

                    flash("Operator parameter updated successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
                else:
                    flash("Invaild operator parameter id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update operator parameter!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))

# Update operator parameter status
@service_configurations.route("/update_operator_parameter_status",methods=["POST","GET"])
def update_operator_parameter_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorParameterId = request.args.get("operatorParameterId","")
    if operatorParameterId:
        try:
            operator_parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__nin=[2]).first()
            if operator_parameter_queryset:
                if operator_parameter_queryset.status == 0:
                    operator_parameter_queryset.update(status=1)
                    flash("Operator parameter activated successfully!")
                elif operator_parameter_queryset.status == 1:
                    operator_parameter_queryset.update(status=0)
                    flash("Operator parameter deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update operator parameter status!!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))


# Delete operator parameter
@service_configurations.route("/delete_operator_parameter",methods=["GET","POST"])
def delete_operator_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            operatorParameterId = request.args.get("operatorParameterId","")
            operator_parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__in=[0,1]).first()
            operator_parameter_queryset.update(status=2)
            flash("Operator parameter deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator parameter!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorParameter"))


########## Operator Grouping ############
#Add operator grouping
@service_configurations.route("/add_operator_grouping",methods=["POST","GET"])
def add_operator_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            groupName = request.form.get("groupName","")
            operatorId = request.form.get("operatorId","")
            operatorParameterId = request.form.get("operatorParameterId","")
            value = request.form.get("value","")
            if groupName and operatorId and operatorParameterId:
                try:
                    operator_grouping_table = OperatorGrouping(
                        adminId = adminId,
                        groupName = groupName,
                        operatorId = operatorId,
                        operatorParameterId = operatorParameterId,
                        value = value,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = operator_grouping_table.save()
                    operatorGroupingId = str(save_table.id)
                    flash("Operator grouping added successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add operator grouping!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)

def fetching_operator_grouping_details(grouping_queryset):
    grouping_dict = {}
    try:
        grouping_dict = {
        "id":str(grouping_queryset.id),
        "groupName":grouping_queryset.groupName,
        "value":grouping_queryset.value
        }
        try:
            if grouping_queryset.operatorId:
                grouping_dict["operatorId"]=str(grouping_queryset.operatorId.id)
                grouping_dict["operatorName"]=grouping_queryset.operatorId.operatorName
            else:
                grouping_dict["operatorId"]=""
                grouping_dict["operatorName"]=""
        except Exception as e:
            grouping_dict["operatorId"]=""
            grouping_dict["operatorName"]=""

        try:
            if grouping_queryset.operatorParameterId:
                grouping_dict["operatorParameterId"]=str(grouping_queryset.operatorParameterId.id)
                grouping_dict["parameterName"]=grouping_queryset.operatorParameterId.parameterName
            else:
                grouping_dict["operatorParameterId"]=""
                grouping_dict["parameterName"]=""
        except Exception as e:
            grouping_dict["operatorParameterId"]=""
            grouping_dict["parameterName"]=""

        if grouping_queryset.status==1:
            grouping_dict["actionText"] = "Active"
        else:
            grouping_dict["actionText"] = "Deactive"
        if grouping_queryset.createdOn:
            grouping_dict["createdOn"] = grouping_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            grouping_dict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return grouping_dict

# update operator grouping
@service_configurations.route("/update_operator_grouping",methods=["POST","GET"])
def update_operator_grouping():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        operatorGroupingId = request.args.get("operatorGroupingId","")
        if request.method == "POST":
            groupName = request.form.get("groupName","")
            operatorId = request.form.get("operatorId","")
            operatorParameterId = request.form.get("operatorParameterId","")
            value = request.form.get("value","")
            if operatorGroupingId and groupName and operatorId and operatorParameterId:
                operator_grouping_queryset = OperatorGrouping.objects(id=operatorGroupingId,status__nin=[2]).first()
                if operator_grouping_queryset:
                    operator_grouping_queryset.update(
                        groupName = groupName,
                        operatorId = ObjectId(operatorId),
                        operatorParameterId = ObjectId(operatorParameterId),
                        value = value,
                        )
                    flash("Operator grouping updated successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
                else:
                    flash("Invaild operator grouping id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error="Unable to update operator grouping!!"
        return redirect(url_for("service_configurations.service_configurations_list",error=error))

# Update operator grouping status
@service_configurations.route("/update_operator_grouping_status",methods=["POST","GET"])
def update_operator_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    operatorGroupingId = request.args.get("operatorGroupingId","")
    if operatorGroupingId:
        try:
            operator_grouping_queryset = OperatorGrouping.objects(id=operatorGroupingId,status__nin=[2]).first()
            if operator_grouping_queryset:
                if operator_grouping_queryset.status == 0:
                    operator_grouping_queryset.update(status=1)
                    flash("Operator grouping activated successfully!")
                elif operator_grouping_queryset.status == 1:
                    operator_grouping_queryset.update(status=0)
                    flash("Operator grouping deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update operator grouping status!!",redirectTo="OperatorGrouping")
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))


# Delete operator grouping
@service_configurations.route("/delete_operator_grouping",methods=["GET","POST"])
def delete_operator_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            operatorGroupingId = request.args.get("operatorGroupingId","")
            operator_grouping_queryset = OperatorGrouping.objects(id=operatorGroupingId,status__in=[0,1]).first()
            operator_grouping_queryset.update(status=2)
            flash("Operator grouping deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete operator grouping!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="OperatorGrouping"))

# Add category
@service_configurations.route("/add_service_grouping",methods=["POST","GET"])
def add_service_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            name = request.form.get("name","")
            sorting = request.form.get("sorting")

            if name:
                try:
                    service_grouping_table = ServiceGrouping(
                        adminId=adminId,
                        name = name,
                        sorting = sorting,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = service_grouping_table.save()
                    serviceGroupingId = str(save_table.id)

                    flash("Service grouping saved successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
                except Exception as e:
                    flash("Unable to save service grouping!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save service grouping!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)


# Update category status
@service_configurations.route("/update_service_grouping_status",methods=["POST","GET"])
def update_service_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    serviceGroupingId = request.args.get("serviceGroupingId","")

    if serviceGroupingId:
        try:
            service_grouping_queryset = ServiceGrouping.objects(id=serviceGroupingId,status__nin=[2]).first()
            if service_grouping_queryset:
                if service_grouping_queryset.status == 0:
                    service_grouping_queryset.update(status=1)
                    flash("Service grouping activated successfully!")
                elif service_grouping_queryset.status == 1:
                    service_grouping_queryset.update(status=0)
                    flash("Service grouping deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
    else:
        return redirect(url_for("service_configurations.service_configurations_list"))



# Update Service grouping
@service_configurations.route("/update_service_grouping",methods=["POST","GET"])
def update_service_grouping():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        serviceGroupingId = request.args.get("serviceGroupingId","")
        if request.method == "POST":
            name = request.form.get("name","")
            sorting = request.form.get("sorting")
            service_grouping_queryset = ServiceGrouping.objects(id=serviceGroupingId,status__nin=[2]).first()
            if service_grouping_queryset:
                service_grouping_queryset.update(
                    name=name,
                    sorting=sorting,
                    )
                flash("Service grouping updated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update category!!"
        return redirect(url_for("service_configurations.service_configurations_list",error=error,redirectTo="ServiceGrouping"))


# Delete Service grouping
@service_configurations.route("/delete_service_grouping",methods=["GET"])
def delete_service_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            serviceGroupingId = request.args.get("serviceGroupingId","")
            service_grouping_queryset = ServiceGrouping.objects(id=serviceGroupingId,status__nin=[2]).first()
            service_grouping_queryset.update(status=2)
            flash("Service grouping deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete service grouping!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="ServiceGrouping"))




@service_configurations.route("/transaction_based_services_list",methods=["POST"])
def transaction_based_services_list():
    data_status = {"responseStatus":0,"result":""}
    try:
        transactionId = request.form.get("transactionId","")
        if not transactionId:
            data_status["result"]="Required fields are missing!!"
            return data_status
        transaction_queryset = TransactionAPI.objects(id=transactionId,status__in=[1]).first()
        if not transaction_queryset:
            data_status["result"]="Invalid transaction id!!"
            return data_status
        servicesList = []
        services_queryset = Service.objects(transactionAPIId=str(transaction_queryset.id),status__in=[1]).order_by("-id").all()
        for each_service in services_queryset:
            service_dict = fetching_service_details(each_service)
            servicesList.append(service_dict)
        data_status["responseStatus"]=1
        data_status["result"]="Services fetched data successfully!"
        data_status["servicesList"]=servicesList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"]="Unable to fetch services data!!"
        return data_status

@service_configurations.route("/operator_based_operator_parameters_list",methods=["POST"])
def operator_based_operator_parameters_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorId = request.form.get("operatorId","")

    if not operatorId:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        operator_queryset = Operators.objects(id=operatorId,status__in=[1]).first()
        if not operator_queryset:
            data_status["result"]="Invalid operator id!!"
            return data_status

        operatorParametersList = []
        operator_parameters_queryset = OperatorParameter.objects(
            hasGrouping=True,
            operatorId=str(operator_queryset.id),status__in=[1]).order_by("-id").all()
        for each_operator_parameter in operator_parameters_queryset:
            operator_parameter_dict = fetching_operator_based_parameter_details(each_operator_parameter)
            operatorParametersList.append(operator_parameter_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Operator based operator parameters data fetched successfully!"
        data_status["operatorParametersList"] = operatorParametersList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch operator parameters data!!"
        return data_status

@service_configurations.route("/operator_based_operator_sub_parameters_list",methods=["POST"])
def operator_based_operator_sub_parameters_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorId = request.form.get("operatorId","")

    if not operatorId:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        operator_queryset = Operators.objects(id=operatorId,status__in=[1]).first()
        if not operator_queryset:
            data_status["result"]="Invalid operator id!!"
            return data_status

        operatorSubParametersList = []
        sub_parameters_queryset = SubParameters.objects(
            hasGrouping=True,
            operatorId=str(operator_queryset.id),status__in=[1]).order_by("-id").all()
        for each_sub_parameter in sub_parameters_queryset:
            sub_parameter_dict = fetching_operator_based_sub_parameter_details(each_sub_parameter)
            operatorSubParametersList.append(sub_parameter_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Operator based sub parameters data fetched successfully!"
        data_status["operatorSubParametersList"] = operatorSubParametersList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch sub parameters data!!"
        return data_status


########### Sub Parameters ##############
# Add Sub parameter
@service_configurations.route("/add_sub_parameter",methods=["POST","GET"])
def add_sub_parameter():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            operatorParameterId = request.form.get("operatorParameterId","")
            operatorGroupingId = request.form.get("operatorGroupingId","")
            parameterName = request.form.get("parameterName","")
            displayName = request.form.get("displayName","")
            operatorId = request.form.get("operatorId","")
            minLength = request.form.get("minLength")
            maxLength = request.form.get("maxLength")
            sort = request.form.get("sort")
            # manualSort = request.form.get("manualSort")
            fieldType = request.form.get("fieldType","")
            pattern = request.form.get("pattern","")
            apiCode = request.form.get("apiCode","")
            transactionAPIId = request.form.get("transactionAPIId","")
            isActive = request.form.get("isActive")
            isReferenceKey = request.form.get("isReferenceKey")
            isMandatory = request.form.get("isMandatory")
            hasGrouping = request.form.get("hasGrouping")
            hasApiCall = request.form.get("hasApiCall")
            hasSubParameters = request.form.get("hasSubParameters")
            hasIncludeApiCall = request.form.get("hasIncludeApiCall")
            apiCall = request.form.get("apiCall","")

            if parameterName:
                try:
                    sub_parameter_table = SubParameters(
                        adminId = adminId,
                        operatorParameterId = operatorParameterId,
                        operatorGroupingId = operatorGroupingId,
                        parameterName = parameterName,
                        displayName = displayName,
                        operatorId = operatorId,
                        minLength = minLength,
                        maxLength = maxLength,
                        sort = sort,
                        fieldType = fieldType,
                        pattern = pattern,
                        apiCode = apiCode,
                        apiCall =apiCall,
                        transactionAPIId = transactionAPIId,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = sub_parameter_table.save()
                    subParameterId = str(save_table.id)


                    if isActive == None:
                        save_table.update(isActive=False)
                    else:
                        save_table.update(isActive=True)

                    if hasIncludeApiCall == None:
                        save_table.update(hasIncludeApiCall=False)
                    else:
                        save_table.update(hasIncludeApiCall=True)

                    if isMandatory == None:
                        save_table.update(isMandatory=False)
                    else:
                        save_table.update(isMandatory=True)

                    if isReferenceKey == None:
                        save_table.update(isReferenceKey=False)
                    else:
                        save_table.update(isReferenceKey=True)

                    if hasGrouping == None:
                        save_table.update(hasGrouping=False)
                    else:
                        save_table.update(hasGrouping=True)

                    if hasApiCall == None:
                        save_table.update(hasApiCall=False)
                    else:
                        save_table.update(hasApiCall=True)

                    flash("Sub parameter added successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    flash("Unable to add sub parameter!!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add sub parameter!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)

# Update Sub parameter
@service_configurations.route("/update_sub_parameter",methods=["POST","GET"])
def update_sub_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:  
        subParameterId = request.args.get("subParameterId","")
        if request.method == "POST":
            operatorParameterId = request.form.get("operatorParameterId","")
            operatorGroupingId = request.form.get("operatorGroupingId","")
            parameterName = request.form.get("parameterName","")
            displayName = request.form.get("displayName","")
            operatorId = request.form.get("operatorId","")
            minLength = request.form.get("minLength")
            maxLength = request.form.get("maxLength")
            sort = request.form.get("sort")
            fieldType = request.form.get("fieldType","")
            pattern = request.form.get("pattern","")
            apiCode = request.form.get("apiCode","")
            transactionAPIId = request.form.get("transactionAPIId","")
            isActive = request.form.get("isActive")
            isMandatory = request.form.get("isMandatory")
            isReferenceKey = request.form.get("isReferenceKey")
            hasGrouping = request.form.get("hasGrouping")
            hasApiCall = request.form.get("hasApiCall")
            hasIncludeApiCall = request.form.get("hasIncludeApiCall")
            apiCall = request.form.get("apiCall","")

            if subParameterId:
                sub_parameter_queryset = SubParameters.objects(id=subParameterId,status__nin=[2]).first()
                if sub_parameter_queryset:
                    sub_parameter_queryset.update(
                        operatorParameterId = ObjectId(operatorParameterId),
                        operatorGroupingId = ObjectId(operatorGroupingId),
                        parameterName = parameterName,
                        displayName = displayName,
                        operatorId = ObjectId(operatorId),
                        minLength = minLength,
                        maxLength = maxLength,
                        sort = sort,
                        fieldType = fieldType,
                        pattern = pattern,
                        apiCode = apiCode,
                        transactionAPIId = ObjectId(transactionAPIId),
                        apiCall = apiCall,
                        )
                    if isActive == None:
                        sub_parameter_queryset.update(isActive=False)
                    else:
                        sub_parameter_queryset.update(isActive=True)

                    if hasIncludeApiCall == None:
                        sub_parameter_queryset.update(hasIncludeApiCall=False)
                    else:
                        sub_parameter_queryset.update(hasIncludeApiCall=True)

                    if isMandatory == None:
                        sub_parameter_queryset.update(isMandatory=False)
                    else:
                        sub_parameter_queryset.update(isMandatory=True)

                    if isReferenceKey == None:
                        sub_parameter_queryset.update(isReferenceKey=False)
                    else:
                        sub_parameter_queryset.update(isReferenceKey=True)

                    if hasGrouping == None:
                        sub_parameter_queryset.update(hasGrouping=False)
                    else:
                        sub_parameter_queryset.update(hasGrouping=True)
                    if hasApiCall == None:
                        sub_parameter_queryset.update(hasApiCall=False)
                    else:
                        sub_parameter_queryset.update(hasApiCall=True)

                    flash("Sub parameter updated successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
                else:
                    flash("Invaild operator sub id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update sub parameter!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))

# Delete Sub parameter
@service_configurations.route("/delete_sub_parameter",methods=["POST","GET"])
def delete_sub_parameter():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        subParameterId = request.args.get("subParameterId","")
        if subParameterId:
            sub_parameter_queryset = SubParameters.objects(id=subParameterId,status__nin=[2]).first()
            if sub_parameter_queryset:
                sub_parameter_queryset.update(status=2)
                flash("Sub parameter deleted successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
            else:
                flash("Invaild sub parameter id !!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete sub parameter!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))

# Update Sub parameter status
@service_configurations.route("/update_sub_parameter_status",methods=["POST","GET"])
def update_sub_parameter_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        subParameterId = request.args.get("subParameterId","")
        if subParameterId:
            sub_parameter_queryset = SubParameters.objects(id=subParameterId,status__nin=[2]).first()
            if sub_parameter_queryset:
                if sub_parameter_queryset.status == 0:
                    sub_parameter_queryset.update(status=1)
                    flash("Sub parameter status activated successfully!")
                elif sub_parameter_queryset.status == 1:
                    sub_parameter_queryset.update(status=0)
                    flash("Sub parameter status deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
            else:
                flash("Invaild sub parameter id !!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
        else:
            flash("Required fields are missing!!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameter"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update sub parameter status!!")

###################### Sub Parameter Grouping ##########################
@service_configurations.route("/add_sub_parameter_grouping",methods=["POST","GET"])
def add_sub_parameter_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            groupName = request.form.get("groupName","")
            subParameterId = request.form.get("subParameterId","")
            operatorId = request.form.get("operatorId","")
            value = request.form.get("value","")

            if groupName and subParameterId and operatorId:
                try:
                    sub_parameter_grouping_table = SubParameterGrouping(
                        adminId = adminId,
                        groupName = groupName,
                        subParameterId = subParameterId,
                        operatorId = operatorId,
                        value = value,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = sub_parameter_grouping_table.save()
                    subParameterGroupingId = str(save_table.id)
                    flash("Sub parameter grouping added successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
                except Exception as e:
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to add sub parameter grouping!!"
        return render_template("super_admin_templates/service_configurations_list.html",error=error)

def fetching_sub_parameter_grouping_details(sub_parameter_grouping_queryset):
    subGroupingDict = {}
    try:
        subGroupingDict = {
        "id":str(sub_parameter_grouping_queryset.id),
        "groupName":sub_parameter_grouping_queryset.groupName,
        "subParameterId":str(sub_parameter_grouping_queryset.subParameterId.id),
        "subParameterName":sub_parameter_grouping_queryset.subParameterId.parameterName,
        "operatorId":str(sub_parameter_grouping_queryset.operatorId.id),
        "operatorName":sub_parameter_grouping_queryset.operatorId.operatorName,
        "value":sub_parameter_grouping_queryset.value,
        }
        if sub_parameter_grouping_queryset.status==1:
            subGroupingDict["actionText"] = "Active"
        else:
            subGroupingDict["actionText"] = "Deactive"
        if sub_parameter_grouping_queryset.createdOn:
            subGroupingDict["createdOn"] = sub_parameter_grouping_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            subGroupingDict["createdOn"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return subGroupingDict


@service_configurations.route("/update_sub_parameter_grouping",methods=["POST","GET"])
def update_sub_parameter_grouping():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        subParameterGroupingId = request.args.get("subParameterGroupingId","")
        if request.method == "POST":
            groupName = request.form.get("groupName","")
            subParameterId = request.form.get("subParameterId","")
            operatorId = request.form.get("operatorId","")
            value = request.form.get("value","")
            if subParameterGroupingId and groupName and subParameterId and operatorId:
                sub_parameter_grouping_queryset = SubParameterGrouping.objects(id=subParameterGroupingId,status__nin=[2]).first()
                if sub_parameter_grouping_queryset:
                    sub_parameter_grouping_queryset.update(
                        groupName = groupName,
                        subParameterId = ObjectId(subParameterId),
                        operatorId = ObjectId(operatorId),
                        value = value,
                        )
                    flash("Sub parameter grouping updated successfully!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
                else:
                    flash("Invaild sub parameter grouping id !!")
                    return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error="Unable to update sub parameter grouping!!"
        return redirect(url_for("service_configurations.service_configurations_list",error=error))


@service_configurations.route("/update_sub_parameter_grouping_status",methods=["POST","GET"])
def update_sub_parameter_grouping_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    subParameterGroupingId = request.args.get("subParameterGroupingId","")
    if subParameterGroupingId:
        try:
            sub_parameter_grouping_queryset = SubParameterGrouping.objects(id=subParameterGroupingId,status__nin=[2]).first()
            if sub_parameter_grouping_queryset:
                if sub_parameter_grouping_queryset.status == 0:
                    sub_parameter_grouping_queryset.update(status=1)
                    flash("Sub parameter grouping activated successfully!")
                elif sub_parameter_grouping_queryset.status == 1:
                    sub_parameter_grouping_queryset.update(status=0)
                    flash("Sub parameter grouping deactivated successfully!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            flash("Unable to update sub parameter grouping status!!",redirectTo="SubParameterGrouping")
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))


@service_configurations.route("/delete_sub_parameter_grouping",methods=["GET","POST"])
def delete_sub_parameter_grouping():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            subParameterGroupingId = request.args.get("subParameterGroupingId","")
            sub_parameter_grouping_queryset = SubParameterGrouping.objects(id=subParameterGroupingId,status__in=[0,1]).first()
            sub_parameter_grouping_queryset.update(status=2)
            flash("Sub parameter grouping deleted successfully!")
            return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete sub parameter grouping!!")
        return redirect(url_for("service_configurations.service_configurations_list",redirectTo="SubParameterGrouping"))


@service_configurations.route("/operator_parameter_based_operator_grouping_list",methods=["POST"])
def operator_parameter_based_operator_grouping_list():
    data_status = {"responseStatus": 0, "result": ""}
    operatorParameterId = request.form.get("operatorParameterId","")

    if not operatorParameterId:
        data_status["result"] = "Required fields are missing!!"
        return data_status
    try:
        parameter_queryset = OperatorParameter.objects(id=operatorParameterId,status__in=[1]).first()
        if not parameter_queryset:
            data_status["result"]="Invalid operator id!!"
            return data_status

        operatorGroupingList = []
        operators_grouping_queryset = OperatorGrouping.objects(
            operatorParameterId=str(parameter_queryset.id),status__in=[1]).order_by("-id").all()
        for each_operator_grouping in operators_grouping_queryset:
            operator_grouping_dict = fetching_operator_grouping_details(each_operator_grouping)
            operatorGroupingList.append(operator_grouping_dict)

        data_status["responseStatus"] = 1
        data_status["result"] = "Operator parameter based sub grouping data fetched successfully!"
        data_status["operatorGroupingList"] = operatorGroupingList
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to fetch sub parameter grouping data!!"
        return data_status


@service_configurations.route("/create_bbps_services",methods=["GET"])
def create_bbps_services():
    data_status = {"responseStatus": 0, "result": ""} 
    try:
        
        servicesNamesList = [
        "LOAN",
        "INSURANCE",
        "GAS",
        "ELECTRICITY",
        "MOBILE PREPAID",
        "FASTAG",
        "EDUCATION",
        "WATER",
        "ENTERTAINMENT",
        "LANDLINE POSTPAID",
        "MOBILE POSTPAID",
        "CABLE",
        "DTH",
        "BROADBAND POSTPAID",
        "LPG GAS",
        "MUNICIPAL TAXES",
        "HOUSING SOCIETY",
        "MUNICIPAL SERVICES",
        "HOSPITAL",
        "SUBSCRIPTION",
        "TRAVEL-SUB",
        "CREDIT CARD",
        "TRANSIT CARD",
        "CLUBS AND ASSOCIATIONS",
        "APARTMENT",
        "RECURRING DEPOSIT",
        "RENTAL",
        "DONATION",
        "PREPAID METER"
        ]
        sorting = 0
        for each_service_name in servicesNamesList:
            sorting = sorting+1
            service_table = Service(
                adminId = "6582f0b60f2b1fb508ce05a4",
                serviceName = each_service_name,
                serviceType = "Debit",
                walletId = "658e7a8f6d7f0f9a8730cd25",
                categoryId = "658c09d7c4dd70a5860c863d",
                serviceGroupingId = "65b8d07bfe293ad4e39ed90a",
                transactionAPIId = None,
                code = each_service_name,
                sorting = sorting,
                isService = True,
                isbbps = True,
                isOperatorWise=False,
                displayInDashboard=False,
                createdOn = datetime.datetime.now(),
                status = 1,
                )
            save_table = service_table.save()

        data_status["responseStatus"] = 1
        data_status["result"] = "Success"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to create data!!"
        return data_status

@service_configurations.route("/create_payu_bbps_operators",methods=["GET"])
def create_payu_bbps_operators():
    data_status = {"responseStatus": 0, "result": ""} 
    try:
        servicesNamesList = [
        # "LOAN",
        # "INSURANCE",
        # "GAS",
        # "ELECTRICITY",
        "MOBILE PREPAID",
        # "FASTAG",
        # "EDUCATION",
        # "WATER",
        # "ENTERTAINMENT",
        # "LANDLINE POSTPAID",
        # "MOBILE POSTPAID",
        # "CABLE",
        # "DTH",
        # "BROADBAND POSTPAID",
        # "LPG GAS",
        # "MUNICIPAL TAXES",
        # "HOUSING SOCIETY",
        # "MUNICIPAL SERVICES",
        # "HOSPITAL",
        # "SUBSCRIPTION",
        # "TRAVEL-SUB",
        # "CREDIT CARD",
        # "TRANSIT CARD",
        # "CLUBS AND ASSOCIATIONS",
        # "APARTMENT",
        # "RECURRING DEPOSIT",
        # "RENTAL",
        # "DONATION",
        # "PREPAID METER"
        ]
        sorting = 0
        for each_service_name in servicesNamesList:
            url = "https://nbc.payu.in/payu-nbc/v1/nbc/getBillerByBillerCategory?billerCategoryName="+str(each_service_name)

            headers = {"authorization": "Bearer 4ab8ae1e07aaa28f7df3d0fd4d8ff19e18b854c165f7e52cd8b5451f848513af"}

            response = requests.get(url, headers=headers)

            jsonResponseData = json.loads(response.text)

            print(jsonResponseData,"jsonResponseData")
            return jsonResponseData

            # billersList = jsonResponseData.get("payload",{}).get("billers",[])

            # if billersList:
            #     print("HII")
            #     service_queryset = Service.objects(serviceName__iexact=each_service_name).first()
            #     if service_queryset:
            #         print("Helloo")
            #         for each_biller in billersList:
            #             print("Welcome")
            #             sorting = sorting+1
            #             if each_biller.get("fetchOption") == "MANDATORY":
            #                 payWithoutFetchAllowed = False
            #             else:
            #                 payWithoutFetchAllowed = True
            #             operator_table = Operators(
            #                 adminId = "6582f0b60f2b1fb508ce05a4",
            #                 operatorName = each_biller.get("billerName"),
            #                 serviceId = str(service_queryset.id),
            #                 allowType = "",
            #                 taxTypeId = "6593bea20d9792b77af5df60",
            #                 serviceGroupingId = "65b8d07bfe293ad4e39ed90a",
            #                 transactionAPIId = "66b7062f7ffbd317514548eb",
            #                 amountPlans = "0",
            #                 rejectedAmount = 0,
            #                 minLength = 0,
            #                 maxLength = 0,
            #                 minAmount = 0,
            #                 maxAmount = 0,
            #                 apiType = "Bbps",
            #                 apiCode = each_biller.get("billerId"),
            #                 stateId = None,
            #                 sorting = sorting,
            #                 isBbps = True,
            #                 isValidate = True,
            #                 displayInDashboard = False,
            #                 isPortial = False,
            #                 isRandom = False,
            #                 payWithoutFetchAllowed = payWithoutFetchAllowed,
            #                 createdOn = datetime.datetime.now(),
            #                 status = 1,
            #                 )
            #             save_table = operator_table.save()
            #             operatorId = str(save_table.id)

            #             if operatorId:
            #                 print("OPERATOR")
            #                 if each_biller.get("customerParams") == None:
            #                     pass
            #                 else:
            #                     for each_operator_parameter in each_biller.get("customerParams"):
            #                         print("PARMETER")
            #                         if each_operator_parameter.get("optional") == False:
            #                             isMandatory= True
            #                         else:
            #                             isMandatory= False

            #                         minLength_value = each_operator_parameter.get("minLength", "")
            #                         # Ensure minLength_value is treated as a string
            #                         if isinstance(minLength_value, int):
            #                             minLength = minLength_value
            #                         else:
            #                             minLength_str = str(minLength_value).strip()  # Convert to string and strip whitespace
            #                             if minLength_str.isdigit():
            #                                 minLength = int(minLength_str)
            #                             else:
            #                                 minLength = 0  # or some other default value if not a valid number

            #                         maxLength_str = each_operator_parameter.get("maxLength", "")
            #                         # Ensure maxLength_str is treated as a string
            #                         if isinstance(maxLength_str, int):
            #                             maxLength = maxLength_str
            #                         else:
            #                             minLength_str = str(maxLength_str).strip()  # Convert to string and strip whitespace
            #                             if maxLength_str.isdigit():
            #                                 maxLength = int(maxLength_str)
            #                             else:
            #                                 maxLength = 0  # or some other default value if not a valid number


            #                         operator_parameter_table = OperatorParameter(
            #                             adminId = "6582f0b60f2b1fb508ce05a4",
            #                             parameterName = each_operator_parameter.get("paramName"),
            #                             displayName = each_operator_parameter.get("paramName"),
            #                             operatorId = operatorId,
            #                             minLength = minLength,
            #                             maxLength = maxLength,
            #                             sort = sorting,
            #                             fieldType = each_operator_parameter.get("dataType"),
            #                             pattern = each_operator_parameter.get("regex"),
            #                             apiCode = each_biller.get("billerId"),
            #                             apiCall ="apiCall",
            #                             transactionAPIId = "66b7062f7ffbd317514548eb",
            #                             createdOn = datetime.datetime.now(),
            #                             status = 1,
            #                             isActive= True,
            #                             hasIncludeApiCall= True,
            #                             isMandatory= isMandatory,
            #                             isReferenceKey= False,
            #                             hasGrouping= False,
            #                             hasApiCall= False,
            #                             hasSubParameters= False,
            #                             )
            #                         save_table = operator_parameter_table.save()
            #                         operatorParameterId = str(save_table.id)

        data_status["responseStatus"] = 1
        data_status["result"] = "Success"
        return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        data_status["result"] = "Unable to create data!!"
        return data_status
