from appservices.common.util import *

ticket_master = Blueprint("ticket_master",__name__)

# Add Tax Type
@ticket_master.route("/add_ticket_category",methods=["POST","GET"])
def add_ticket_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            name = request.form.get("name","")
            # userTypeId = request.form.get("userTypeId","")
            priority = request.form.get("priority","")
            icon = request.files.get("icon","")
            if name:
                try:
                    ticket_category_table = TicketCategory(
                        adminId = adminId,
                        name = name,
                        # userTypeId = userTypeId,
                        priority = priority,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = ticket_category_table.save()
                    ticketCategoryId = str(save_table.id)
                    if icon:
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"))
                        save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"+ticketCategoryId+".png"))
                        save_table.update(icon="media/TicketCategory/"+ticketCategoryId+".png")
                    flash("Ticket Category saved successfully!")
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))

                except Exception as e:
                    flash("Unable to save ticket category!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
            else:
                flash("Required fields are missing    ticket_master!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save ticket category!!"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

def fetch_ticket_category_details(ticket_category_queryset):
    ticket_category_dict = {}
    try:
        ticket_category_dict={
        "id":str(ticket_category_queryset.id),
        "name":ticket_category_queryset.name,
        # "userTypeId":str(ticket_category_queryset.userTypeId.id),
        # "userTypeName":ticket_category_queryset.userTypeId.userType,
        "priority":ticket_category_queryset.priority,
        }
        if ticket_category_queryset.status==1:
            ticket_category_dict["actionText"] = "Active"
        else:
            ticket_category_dict["actionText"] = "Deactive"
        if ticket_category_queryset.createdOn:
            ticket_category_dict["createdOn"] = ticket_category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            ticket_category_dict["createdOn"] = ""
        if ticket_category_queryset.icon:
            ticket_category_dict["icon"] = domain+ticket_category_queryset.icon
        else:
            ticket_category_dict["icon"] = ""

    except Exception as e:
        app.logger.error(traceback.format_exc())
    return ticket_category_dict

# View All Ticket Category
@ticket_master.route("/ticket_masters_list",methods=["POST","GET"])
def ticket_masters_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    ticketCategoryList = []
    subCategoriesList = []
    childCategoriesList = []
    knowledgeMastersList = []
    userTypesList = []
    adminId = session.get("adminId")

    ############### User Type Dropdown ################
    # user_types_queryset = UserTypes.objects(status__in=[1]).order_by('-id').all()
    # for each_user_type in user_types_queryset:
    #     user_type_dict = {
    #         "id":str(each_user_type.id),
    #         "userType":each_user_type.userType,
    #     }
    #     userTypesList.append(user_type_dict)

    try:
        redirectTo = request.args.get('redirectTo','TicketCategory')
        if redirectTo:
            redirectval = redirectTo
        else:
            redirectval = "TicketCategory"
        search = False  
        search_element = request.args.get('search_element','')
        if not search_element:
            search_element = request.form.get("search_element","")
        if search_element:
            search = True
        page = request.args.get(get_page_parameter(), type=int, default=1)
        page_start,page_end=fetch_limit_length_based_on_page_index(page,20)
        pagination = Pagination(
            page=page,
            record_name='ticket_master',
            per_page=20,
            alignment="right"
            )
        ticket_category_queryset = TicketCategory.objects(status__in=[0,1]).order_by("-id").all()
        if search_element:
            ticket_category_queryset = ticket_category_queryset.filter(Q(name__icontains=search_element))
            length = ticket_category_queryset.count()
            ticket_category_queryset=ticket_category_queryset[page_start:page_end]
        else:
            length = ticket_category_queryset.count()
            ticket_category_queryset=ticket_category_queryset[page_start:page_end]
        for each_ticket_category in ticket_category_queryset:
            ticket_category_dict = fetch_ticket_category_details(each_ticket_category)
            ticketCategoryList.append(ticket_category_dict)

        ############ Ticket Sub Categories ################
        sub_category_queryset = TicketSubCategory.objects(status__in=[0,1]).order_by("-id").all()
        if search_element:
            sub_category_queryset = sub_category_queryset.filter(Q(name__icontains=search_element))
            length = sub_category_queryset.count()
            sub_category_queryset=sub_category_queryset[page_start:page_end]
        else:
            length = sub_category_queryset.count()
            sub_category_queryset=sub_category_queryset[page_start:page_end]
        for each_sub_category in sub_category_queryset:
            sub_category_dict = fetch_sub_category_details(each_sub_category)
            subCategoriesList.append(sub_category_dict)

        ########## Ticket Child Categories ################
        child_categories_queryset = TicketChildCategory.objects(status__in=[0,1]).order_by("-id").all()
        if search_element:
            child_categories_queryset = child_categories_queryset.filter(Q(name__icontains=search_element))
            length = child_categories_queryset.count()
            child_categories_queryset=child_categories_queryset[page_start:page_end]
        else:
            length = child_categories_queryset.count()
            child_categories_queryset=child_categories_queryset[page_start:page_end]
        for each_child_category in child_categories_queryset:
            child_category_dict = fetch_child_category_details(each_child_category)
            childCategoriesList.append(child_category_dict)


        ############## Knowledge Master ###############
        knowledge_masters_queryset = KnowledgeMaster.objects(status__in=[0,1]).order_by("-id").all()
        if search_element:
            knowledge_masters_queryset = knowledge_masters_queryset.filter(Q(name__icontains=search_element))
            length = knowledge_masters_queryset.count()
            knowledge_masters_queryset=knowledge_masters_queryset[page_start:page_end]
        else:
            length = knowledge_masters_queryset.count()
            knowledge_masters_queryset=knowledge_masters_queryset[page_start:page_end]
        for each_knowledge_master in knowledge_masters_queryset:
            knowledge_master_dict = fetch_knowledge_master_details(each_knowledge_master)
            knowledgeMastersList.append(knowledge_master_dict)


        pagination = Pagination(
            page=page,
            total=length,
            found=length,
            record_name='ticket_master',
            per_page=20,
            alignment="right"
            )
        return render_template("super_admin_templates/ticket_master_list.html",
            ticketCategoryList=ticketCategoryList,
            subCategoriesList=subCategoriesList,
            childCategoriesList=childCategoriesList,
            knowledgeMastersList=knowledgeMastersList,
            userTypesList=userTypesList,
            search_element=search_element,
            pagination=pagination,
            redirectval=redirectval,
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch ticket category details!!"
        return render_template("super_admin_templates/ticket_master_list.html",
            ticketCategoryList=ticketCategoryList,
            subCategoriesList=subCategoriesList,
            childCategoriesList=childCategoriesList,
            knowledgeMastersList=knowledgeMastersList,
            userTypesList=userTypesList,
            search_element=search_element,
            pagination=pagination,
            redirectval=redirectval,
            )
#Update Ticket Category API
@ticket_master.route("/update_ticket_category",methods=["POST","GET"])
def update_ticket_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            ticketCategoryId = request.args.get("ticketCategoryId","")
            name = request.form.get("name","")
            userTypeId = request.form.get("userTypeId","")
            priority = request.form.get("priority","")
            icon = request.files.get("icon","")
            if name:
                try:
                    ticket_category_queryset = TicketCategory.objects(id=ticketCategoryId).first()
                    if ticket_category_queryset:
                        ticket_category_queryset.update(
                            name = name,
                            priority = priority,
                            )
                        if icon:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"))
                            save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketCategory/"+ticketCategoryId+".png"))
                            ticket_category_queryset.update(icon="media/TicketCategory/"+ticketCategoryId+".png")
                        flash("Ticket Category updated successfully!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
                    else:
                        flash("Ticket Category not found!!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
                except Exception as e:
                    flash("Unable to update ticket category!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update ticket category!!"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

#Delete Ticket Category API
@ticket_master.route("/delete_ticket_category",methods=["POST","GET"])
def delete_ticket_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    ticketCategoryId = request.args.get("ticketCategoryId","")
    if ticketCategoryId:
        try:
            ticket_category_queryset = TicketCategory.objects(id=ticketCategoryId,status__in=[0,1]).first()
            if ticket_category_queryset:
                ticket_category_queryset.update(status=2)
                flash("Ticket Category deleted successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
            else:
                flash("Ticket Category not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
        except Exception as e:
            flash("Unable to delete ticket category!!",redirectTo="TicketCategory")
            app.logger.error(traceback.format_exc())
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list"))

#Update Ticket Category Status API
@ticket_master.route("/update_ticket_category_status",methods=["POST","GET"])
def update_ticket_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    ticketCategoryId = request.args.get("ticketCategoryId","")
    if ticketCategoryId:
        try:
            ticket_category_queryset = TicketCategory.objects(id=ticketCategoryId,status__nin=[2]).first()
            if ticket_category_queryset:
                if ticket_category_queryset.status == 0:
                    ticket_category_queryset.update(status=1)
                    flash("Ticket Category  activated successfully!")
                elif ticket_category_queryset.status == 1:
                    ticket_category_queryset.update(status=0)
                    flash("Ticket Category  deactivated successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
            else:
                flash("Ticket Category not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))
        except Exception as e:
            flash("Unable to update ticket category status!!")
            app.logger.error(traceback.format_exc())
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketCategory"))



################# Sub Category ################

@ticket_master.route("/add_sub_category",methods=["POST","GET"])
def add_sub_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            name = request.form.get("name","")
            categoryId = request.form.get("categoryId","")
            priority = request.form.get("priority","")
            icon = request.files.get("icon","")
            if name and categoryId and priority:
                try:
                    sub_category_table = TicketSubCategory(
                        adminId = adminId,
                        name = name,
                        categoryId = categoryId,
                        priority = priority,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = sub_category_table.save()
                    subCategoryId = str(save_table.id)
                    if icon:
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"))
                        save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"+subCategoryId+".png"))
                        save_table.update(icon="media/TicketSubCategory/"+subCategoryId+".png")
                    flash("Ticket Sub Category saved successfully!")
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))

                except Exception as e:
                    flash("Unable to save ticket sub category!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save ticket sub category!!"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

def fetch_sub_category_details(sub_category_queryset):
    sub_category_dict = {}
    try:
        sub_category_dict={
        "id":str(sub_category_queryset.id),
        "name":sub_category_queryset.name,
        "categoryId":str(sub_category_queryset.categoryId.id),
        "categoryName":str(sub_category_queryset.categoryId.name),
        "priority":sub_category_queryset.priority,
        }
        if sub_category_queryset.status==1:
            sub_category_dict["actionText"] = "Active"
        else:
            sub_category_dict["actionText"] = "Deactive"
        if sub_category_queryset.createdOn:
            sub_category_dict["createdOn"] = sub_category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            sub_category_dict["createdOn"] = ""
        if sub_category_queryset.icon:
            sub_category_dict["icon"] = domain+sub_category_queryset.icon
        else:
            sub_category_dict["icon"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return sub_category_dict

#Update ticket sub category API
@ticket_master.route("/update_sub_category",methods=["POST","GET"])
def update_sub_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            subCategoryId = request.args.get("subCategoryId","")
            name = request.form.get("name","")
            categoryId = request.form.get("categoryId","")
            priority = request.form.get("priority","")
            icon = request.files.get("icon","")
            print(request.form)
            print("((((((((request.form))))))))")
            if name and categoryId and priority:
                try:
                    sub_category_queryset = TicketSubCategory.objects(id=subCategoryId,status__nin=[2]).first()
                    if sub_category_queryset:
                        sub_category_queryset.update(
                            name = name,
                            categoryId = ObjectId(categoryId),
                            priority = priority,
                            )
                        if icon:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"))
                            save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketSubCategory/"+subCategoryId+".png"))
                            sub_category_queryset.update(icon="media/TicketSubCategory/"+subCategoryId+".png")
                        flash("Ticket Sub Category updated successfully!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
                    else:
                        flash("Ticket Sub Category not found!!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
                except Exception as e:
                    flash("Unable to update ticket sub category!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update ticket sub category!!"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

#Update ticket sub category status API
@ticket_master.route("/update_sub_category_status",methods=["POST","GET"])
def update_sub_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    subCategoryId = request.args.get("subCategoryId","")
    if subCategoryId:
        try:
            sub_category_queryset = TicketSubCategory.objects(id=subCategoryId,status__nin=[2]).first()
            if sub_category_queryset:
                if sub_category_queryset.status == 0:
                    sub_category_queryset.update(status=1)
                    flash("Ticket Sub Category  activated successfully!")
                elif sub_category_queryset.status == 1:
                    sub_category_queryset.update(status=0)
                    flash("Ticket Sub Category  deactivated successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
            else:
                flash("Ticket Sub Category not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
        except Exception as e:
            flash("Unable to update ticket sub category status!!")
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))

#Delete ticket sub category API
@ticket_master.route("/delete_sub_category",methods=["POST","GET"])
def delete_sub_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    subCategoryId = request.args.get("subCategoryId","")
    if subCategoryId:
        try:
            sub_category_queryset = TicketSubCategory.objects(id=subCategoryId,status__in=[0,1]).first()
            if sub_category_queryset:
                sub_category_queryset.update(status=2)
                flash("Ticket Sub Category deleted successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
            else:
                flash("Ticket Sub Category not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))
        except Exception as e:
            flash("Unable to delete ticket sub category!!")
            app.logger.error(traceback.format_exc())
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="TicketSubCategory"))



######### Child Category ###########
# Add Child category API
@ticket_master.route("/add_child_category",methods=["POST","GET"])
def add_child_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            name = request.form.get("name","")
            subCategoryId = request.form.get("subCategoryId","")
            priority = request.form.get("priority","")
            icon = request.files.get("icon","")
            if name and subCategoryId and priority:
                try:
                    child_category_table = TicketChildCategory(
                        adminId = adminId,
                        name = name,
                        subCategoryId = subCategoryId,
                        priority = priority,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = child_category_table.save()
                    childCategoryId = str(save_table.id)
                    if icon:
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"))
                        save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"+childCategoryId+".png"))
                        save_table.update(icon="media/TicketChildCategory/"+childCategoryId+".png")
                    flash("Ticket Child Category saved successfully!")
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))

                except Exception as e:
                    flash("Unable to save ticket child category!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save ticket child category!!"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

def fetch_child_category_details(child_category_queryset):
    child_category_dict = {}
    try:
        child_category_dict={
        "id":str(child_category_queryset.id),
        "name":child_category_queryset.name,
        "subCategoryId":str(child_category_queryset.subCategoryId.id),
        "subCategoryName":str(child_category_queryset.subCategoryId.name),
        "priority":child_category_queryset.priority,
        }
        if child_category_queryset.status==1:
            child_category_dict["actionText"] = "Active"
        else:
            child_category_dict["actionText"] = "Deactive"
        if child_category_queryset.createdOn:
            child_category_dict["createdOn"] = child_category_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            child_category_dict["createdOn"] = ""
        if child_category_queryset.icon:
            child_category_dict["icon"] = domain+child_category_queryset.icon
        else:
            child_category_dict["icon"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return child_category_dict

#Update ticket child category API
@ticket_master.route("/update_child_category",methods=["POST","GET"])
def update_child_category():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            childCategoryId = request.args.get("childCategoryId","")
            name = request.form.get("name","")
            subCategoryId = request.form.get("subCategoryId","")
            priority = request.form.get("priority","")
            icon = request.files.get("icon","")
            if name and subCategoryId and priority:
                try:
                    child_category_queryset = TicketChildCategory.objects(id=childCategoryId,status__nin=[2]).first()
                    if child_category_queryset:
                        child_category_queryset.update(
                            name = name,
                            subCategoryId = ObjectId(subCategoryId),
                            priority = priority,
                            )
                        if icon:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"))
                            save_file = icon.save(os.path.join(app.config['SITE_ROOT'], "media/TicketChildCategory/"+childCategoryId+".png"))
                            child_category_queryset.update(icon="media/TicketChildCategory/"+childCategoryId+".png")
                        flash("Ticket child category updated successfully!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
                    else:
                        flash("Ticket child category not found!!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
                except Exception as e:
                    flash("Unable to update child category!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update child category!!"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

#Update ticket child category status API
@ticket_master.route("/update_child_category_status",methods=["POST","GET"])
def update_child_category_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    childCategoryId = request.args.get("childCategoryId","")
    if childCategoryId:
        try:
            child_category_queryset = TicketChildCategory.objects(id=childCategoryId,status__nin=[2]).first()
            if child_category_queryset:
                if child_category_queryset.status == 0:
                    child_category_queryset.update(status=1)
                    flash("Ticket Child Category  activated successfully!")
                elif child_category_queryset.status == 1:
                    child_category_queryset.update(status=0)
                    flash("Ticket child category  deactivated successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
            else:
                flash("Ticket child category not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
        except Exception as e:
            flash("Unable to update child category status!!")
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))

#Delete ticket child category API
@ticket_master.route("/delete_child_category",methods=["POST","GET"])
def delete_child_category():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    childCategoryId = request.args.get("childCategoryId","")
    if childCategoryId:
        try:
            child_category_queryset = TicketChildCategory.objects(id=childCategoryId,status__in=[0,1]).first()
            if child_category_queryset:
                child_category_queryset.update(status=2)
                flash("Ticket child category deleted successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
            else:
                flash("Ticket child category not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))
        except Exception as e:
            flash("Unable to delete child category!!")
            app.logger.error(traceback.format_exc())
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="ChildCategory"))


######### Knowledge Master ###########
# Add CKnowledge Master API
@ticket_master.route("/add_knowledge_master",methods=["POST","GET"])
def add_knowledge_master():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            name = request.form.get("name","")
            childCategoryId = request.form.get("childCategoryId","")
            description = request.form.get("description","")
            image = request.files.get("image","")
            if name and childCategoryId:
                try:
                    knowledge_master_table = KnowledgeMaster(
                        adminId = adminId,
                        name = name,
                        childCategoryId = childCategoryId,
                        description = description,
                        )
                    save_table = knowledge_master_table.save()
                    knowledgeMasterId = str(save_table.id)
                    if image:
                        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/")):
                            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"))
                        save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"+knowledgeMasterId+".png"))
                        save_table.update(image="media/KnowledgeMaster/"+knowledgeMasterId+".png")
                    flash("Knowledge master saved successfully!")
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))

                except Exception as e:
                    flash("Unable to save knowledge master")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save knowledge master"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))

def fetch_knowledge_master_details(knowledge_master_queryset):
    knowledge_master_dict={}
    try:
        knowledge_master_dict={
        "id":str(knowledge_master_queryset.id),
        "name":knowledge_master_queryset.name,
        "childCategoryId":str(knowledge_master_queryset.childCategoryId.id),
        "childCategoryName":knowledge_master_queryset.childCategoryId.name,
        "description":knowledge_master_queryset.description,
        }
        if knowledge_master_queryset.status==1:
            knowledge_master_dict["actionText"] = "Active"
        else:
            knowledge_master_dict["actionText"] = "Deactive"
        if knowledge_master_queryset.createdOn:
            knowledge_master_dict["createdOn"] = knowledge_master_queryset.createdOn.strftime("%m-%d-%Y")
        else:
            knowledge_master_dict["createdOn"] = ""
        if knowledge_master_queryset.image:
            knowledge_master_dict["image"] = domain+knowledge_master_queryset.image
        else:
            knowledge_master_dict["image"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return knowledge_master_dict



#Update API
@ticket_master.route("/update_knowledge_master",methods=["POST","GET"])
def update_knowledge_master():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        
        if request.method == "POST":
            knowledgeMasterId = request.args.get("knowledgeMasterId","")
            name = request.form.get("name","")
            childCategoryId = request.form.get("childCategoryId","")
            description = request.form.get("description","")
            image = request.files.get("image","")
            if name and childCategoryId:
                try:
                    knowledge_master_queryset = KnowledgeMaster.objects(id=knowledgeMasterId,status__nin=[2]).first()
                    if knowledge_master_queryset:
                        knowledge_master_queryset.update(
                            name = name,
                            childCategoryId = ObjectId(childCategoryId),
                            description = description,
                            )
                        if image:
                            if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/")):
                                os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"))
                            save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/KnowledgeMaster/"+knowledgeMasterId+".png"))
                            knowledge_master_queryset.update(image="media/KnowledgeMaster/"+knowledgeMasterId+".png")
                        flash("Knowledge master updated successfully!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
                    else:
                        flash("Knowledge master not found!!")
                        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
                except Exception as e:
                    flash("Unable to update knowledge master")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update knowledge master"
        return redirect(url_for("ticket_master.ticket_masters_list",error=error))


#Update status API
@ticket_master.route("/update_knowledge_master_status",methods=["POST","GET"])
def update_knowledge_master_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    knowledgeMasterId = request.args.get("knowledgeMasterId","")
    if knowledgeMasterId:
        try:
            knowledge_master_queryset = KnowledgeMaster.objects(id=knowledgeMasterId,status__nin=[2]).first()
            if knowledge_master_queryset:
                if knowledge_master_queryset.status == 0:
                    knowledge_master_queryset.update(status=1)
                    flash("Knowledge master activated successfully!")
                elif knowledge_master_queryset.status == 1:
                    knowledge_master_queryset.update(status=0)
                    flash("Knowledge master deactivated successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
            else:
                flash("Knowledge master not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
        except Exception as e:
            flash("Unable to update knowledge master status!!")
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))



#Delete API
@ticket_master.route("/delete_knowledge_master",methods=["POST","GET"])
def delete_knowledge_master():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    knowledgeMasterId = request.args.get("knowledgeMasterId","")
    if knowledgeMasterId:
        try:
            knowledge_master_queryset = KnowledgeMaster.objects(id=knowledgeMasterId,status__nin=[2]).first()
            if knowledge_master_queryset:
                knowledge_master_queryset.update(status=2)
                flash("Knowledge master deleted successfully!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
            else:
                flash("Knowledge master not found!!")
                return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))
        except Exception as e:
            flash("Unable to delete knowledge master")
            app.logger.error(traceback.format_exc())
    else:
        flash("Required fields are missing!!")
        return redirect(url_for("ticket_master.ticket_masters_list",redirectTo="KnowledgeMaster"))




@ticket_master.route("/view_all_complaints",methods=["POST","GET"])
def view_all_complaints():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")

        complaintsList = []
        merchantsList = []

        startDate = request.args.get("startDate","")
        endDate = request.args.get("endDate","")
        searchId=request.args.get("searchId","")

        # Set default date format
        date_format = "%d-%m-%Y"
        pagination = None
        try:
            if startDate:
                startDate = datetime.datetime.strptime(startDate, date_format)
                startDate = startDate.replace(hour=0, minute=0, second=0, microsecond=0)
            else:
                startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

            if endDate:
                endDate = datetime.datetime.strptime(endDate, date_format)
                endDate = endDate.replace(hour=23, minute=59, second=59, microsecond=999999)
            else:
                endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
        except Exception as ve:
            app.logger.error("Date parsing error: %s", ve)
            startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
            endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

        merchants_queryset = Users.objects(status__nin=[2]).order_by("-createdOn")
        for each_merchant in merchants_queryset:
            merchantDict = fetching_user_details(each_merchant)
            merchantsList.append(merchantDict)


        complaints_reports_queryset = ComplaintReport.objects(createdOn__gte=startDate,createdOn__lte=endDate).order_by("-createdOn").all()
        # if searchId:
            # complaints_reports_queryset = complaints_reports_queryset.filter(Q(merchantReferenceNumber__icontains=searchId) | Q(transactionUniqueId__icontains=searchId))


        # Get the current page from the query parameters
        page = request.args.get(get_page_parameter(), type=int, default=1)

        per_page = 20  # Number of items per page

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

        start = (page - 1) * per_page

        end = min(start + per_page, total_count)

        total_complaints = complaints_reports_queryset[start:end]
        
        snoCount = start
        for each_complaint in total_complaints:
            snoCount +=1
            complaintDict = {
            "snoCount":snoCount,
            "priority":each_complaint.priority,
            "complaintNumber":each_complaint.complaintNumber,
            "transactionId":each_complaint.transactionId,
            "message":each_complaint.message,
            "createdOn":each_complaint.createdOn.strftime("%d-%m-%Y %I:%M:%S %p")
            }
            if each_complaint.userId:
                complaintDict["userName"]=each_complaint.userId.fullName
            else:
                complaintDict["userName"]=""

            if each_complaint.categoryId:
                complaintDict["categoryName"]=each_complaint.categoryId.name
            else:
                complaintDict["categoryName"]=""

            if each_complaint.complaintTypeId:
                complaintDict["complaintTypeName"]=each_complaint.complaintTypeId.name
            else:
                complaintDict["complaintTypeName"]=""

            if each_complaint.subjectId:
                complaintDict["subjectName"]=each_complaint.subjectId.name
            else:
                complaintDict["subjectName"]=""

            if each_complaint.document:
                complaintDict["document"]=domain+each_complaint.document
            else:
                complaintDict["document"]=""

            complaintsList.append(complaintDict)

        # Pagination object for rendering pagination controls in the template
        pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="complaints")

        return render_template("super_admin_templates/complaints_list.html",
            pagination=pagination,
            complaintsList=complaintsList,
            startDate=startDate.strftime(date_format),
            endDate=endDate.strftime(date_format),
            searchId=searchId
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetched complaints data!!"
        return render_template("super_admin_templates/complaints_list.html", 
            error=error,
            complaintsList=complaintsList,
            pagination=pagination,
            startDate=startDate.strftime(date_format),
            endDate=endDate.strftime(date_format),
            searchId=searchId
            )