
from appservices.common.util import *
from flask import session
grievances = Blueprint("grievances",__name__)



def fetching_grievances(grievances_queryset):
    grievances_dict = {}
    try:
        grievances_dict={
        "id":str(grievances_queryset.id),
        "customerName":grievances_queryset.name,
        "customerMobileNumber":grievances_queryset.mobileNumber,
        "complaint":grievances_queryset.complaint,
       
        }
        try:
            if grievances_queryset.departmentId:
                grievances_dict["departmentId"]=str(grievances_queryset.departmentId.id)
                grievances_dict["departmentName"]=grievances_queryset.departmentId.departmentName
            else:
                grievances_dict["departmentId"]=""
                grievances_dict["departmentName"]=""
        except Exception as e:
            grievances_dict["departmentId"]=""
            grievances_dict["departmentName"]=""

        try:
            if grievances_queryset.assemblyMemberId:
                grievances_dict["assemblyMemberId"]=str(grievances_queryset.assemblyMemberId.id)
                grievances_dict["mlaName"]=grievances_queryset.assemblyMemberId.mlaName
            else:
                grievances_dict["assemblyMemberId"]=""
                grievances_dict["mlaName"]=""
        except Exception as e:
            grievances_dict["assemblyMemberId"]=""
            grievances_dict["mlaName"]=""

        try:
            if grievances_queryset.pincodeId:
                grievances_dict["pincodeId"]=str(grievances_queryset.pincodeId.id)
                grievances_dict["pincode"]=grievances_queryset.pincodeId.pincode
            else:
                grievances_dict["pincodeId"]=""
                grievances_dict["pincode"]=""
        except Exception as e:
            grievances_dict["pincodeId"]=""
            grievances_dict["pincode"]=""

        try:
            if grievances_queryset.pincodeId:
                grievances_dict["blockPoId"]=str(grievances_queryset.pincodeId.blockPoId.id)
                grievances_dict["blockName"]=grievances_queryset.pincodeId.blockPoId.name
            else:
                grievances_dict["blockPoId"]=""
                grievances_dict["blockName"]=""
        except Exception as e:
            grievances_dict["blockPoId"]=""
            grievances_dict["blockName"]=""

        try:
            if grievances_queryset.pincodeId:
                grievances_dict["cityId"]=str(grievances_queryset.pincodeId.blockPoId.cityId.id)
                grievances_dict["cityName"]=grievances_queryset.pincodeId.blockPoId.cityId.cityName
            else:
                grievances_dict["cityId"]=""
                grievances_dict["cityName"]=""
        except Exception as e:
            grievances_dict["cityId"]=""
            grievances_dict["cityName"]=""

        try:
            if grievances_queryset.pincodeId:
                grievances_dict["stateId"]=str(grievances_queryset.pincodeId.blockPoId.cityId.stateId.id)
                grievances_dict["stateName"]=grievances_queryset.pincodeId.blockPoId.cityId.stateId.stateName
            else:
                grievances_dict["stateId"]=""
                grievances_dict["stateName"]=""
        except Exception as e:
            grievances_dict["stateId"]=""
            grievances_dict["stateName"]=""

        try:
            if grievances_queryset.pincodeId:
                grievances_dict["countryId"]=str(grievances_queryset.pincodeId.blockPoId.cityId.stateId.countryId.id)
                grievances_dict["countryName"]=grievances_queryset.pincodeId.blockPoId.cityId.stateId.countryId.countryName
            else:
                grievances_dict["countryId"]=""
                grievances_dict["countryName"]=""
        except Exception as e:
            grievances_dict["countryId"]=""
            grievances_dict["countryName"]=""

        try:
            if grievances_queryset.pincodeId:
                grievances_dict["regionId"]=str(grievances_queryset.pincodeId.blockPoId.cityId.stateId.countryId.regionId.id)
                grievances_dict["regionName"]=grievances_queryset.pincodeId.blockPoId.cityId.stateId.countryId.regionId.regionName
            else:
                grievances_dict["regionId"]=""
                grievances_dict["regionName"]=""
        except Exception as e:
            grievances_dict["regionId"]=""
            grievances_dict["regionName"]=""
        
        if grievances_queryset.status == 1:
            grievances_dict["actionText"] = "Accepted"
        elif grievances_queryset.status == 2:
            grievances_dict["actionText"] = "Rejected"
        else:
            grievances_dict["actionText"] = "Pending"

        if grievances_queryset.createdOn:
            grievances_dict["createdOn"] = grievances_queryset.createdOn.strftime("%d-%m-%Y")
        else:
            grievances_dict["createdOn"] = ""

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



# @grievances.route("/grievances_list", methods=["POST", "GET"])
# def grievances_list():
#     if not session.get("GrievanceAdminId"):
#         return redirect("login")

#     grievancesList = []
#     departmentsList=[]
#     grievancesPagination = ""
#     departmentId = ""

   
#     GrievanceAdminId = session.get("GrievanceAdminId")
#     # permissionsList = check_permissions(session.get("adminId"), "subservicesPermissions")
#     # print(permissionsList, "((((((((permissionsList))))))))")

#     # if "view" in permissionsList:
#     try:
#         redirectTo = request.args.get("redirectTo", "grievances")
#         redirectval = redirectTo if redirectTo else "grievances"

#         departmentId = request.args.get("departmentId","")

#         grievances_queryset = Grievances.objects(status__in=[0,1]).order_by("-sorting")

#         if departmentId:
#             grievances_queryset = grievances_queryset.filter(departmentId=departmentId)
        
#         grievancesPage = request.args.get(get_page_parameter('grievancesPage'), type=int, default=1)
#         per_page = 20
#         total_count = grievances_queryset.count()
#         start = (grievancesPage - 1) * per_page
#         end = min(start + per_page, total_count)

#         total_grievances = grievances_queryset[start:end]
       
#         snoCount = start
#         for each_grievance in total_grievances:
#             snoCount += 1
#             grievances_dict = fetching_grievances(each_grievance)
#             grievances_dict["snoCount"] = snoCount
#             grievancesList.append(grievances_dict)

#         grievancesPagination = Pagination(grievancesPage=grievancesPage, total=total_count, page_parameter="grievancesPage", per_page=per_page, alignment="right", record_name="grievances")

#         departments_queryset = Departments.objects(status__in=[0, 1]).order_by('sorting')

#         for each_department in departments_queryset:

#             departments_dict = fetching_departments(each_department)

#             departmentsList.append(departments_dict)
 
#         # assemblymembers_queryset = AssemblyMembers.objects(status__in=[0, 1]).order_by('sorting')

#         # for each_assemblymember in assemblymembers_queryset:

#         #     departments_dict = {
#         #         "id":str(assemblymembers_queryset.id),
#         #         "mlaName":assemblymembers_queryset.mlaName
#         #     }
#         #     departmentsList.append(departments_dict)
 

#         # pincode_queryset = Pincodes.objects(status__in=[0, 1]).order_by('sorting')

#         # for each_pincode in pincode_queryset:

#         #     pincode_dict = fetching_pincode_details(each_pincode)

#         #     pincodeList.append(pincode_dict)
 
       
#         return render_template("grievance/admin/grievances_list.html",
#             grievancesPagination=grievancesPagination,
#             departmentId=departmentId,
#             grievancesList=grievancesList,
#             departmentsList=departmentsList,
#             redirectval=redirectval,
#         )
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to fetch grievances !!"
#         return render_template("grievance/admin/grievances_list.html",
#             grievancesPagination=grievancesPagination,
#             departmentId=departmentId,
#             grievancesList=grievancesList,
#             departmentsList=departmentsList,
#             redirectval=redirectval,
#         )
#     # else:
#     #     flash("Staff member does not have given view Bank Code permissions!!")
#     #     return redirect(url_for("admin.dashboard"))


@grievances.route("/grievances_list", methods=["POST", "GET"])
def grievances_list():
    if not session.get("GrievanceAdminId"):
        return redirect("login")

    grievancesList = []
    departmentsList = []
    grievancesPagination = ""
    departmentId = request.args.get("departmentId", "")

    try:
        redirectTo = request.args.get("redirectTo", "grievances")
        redirectval = redirectTo if redirectTo else "grievances"

        # Fetch grievances, filtered by status and optionally by department
        grievances_queryset = Grievances.objects(status__in=[0, 1, 2]).order_by("-sorting")
        if departmentId:
            grievances_queryset = grievances_queryset.filter(departmentId=departmentId)

        # Implement pagination
        grievancesPage = request.args.get(get_page_parameter("grievancesPage"), type=int, default=1)
        per_page = 20
        total_count = grievances_queryset.count()
        start = (grievancesPage - 1) * per_page
        end = min(start + per_page, total_count)
        total_grievances = grievances_queryset[start:end]

        # Construct grievances list with serial numbers
        snoCount = start
        for each_grievance in total_grievances:
            snoCount += 1
            grievances_dict = fetching_grievances(each_grievance)
            grievances_dict["snoCount"] = snoCount
            if "status" not in grievances_dict:
                grievances_dict["status"] = 0
            grievancesList.append(grievances_dict)

        # Create pagination object
        grievancesPagination = Pagination(
            page=grievancesPage,
            total=total_count,
            per_page=per_page,
            record_name="grievances",
            alignment="right",
        )

        # Fetch departments
        departments_queryset = Departments.objects(status__in=[0, 1]).order_by("sorting")
        for each_department in departments_queryset:
            departments_dict = fetching_departments(each_department)
            departmentsList.append(departments_dict)

        return render_template(
            "grievance/admin/grievances_list.html",
            grievancesPagination=grievancesPagination,
            grievancesList=grievancesList,
            departmentsList=departmentsList,
            redirectval=redirectval,
            departmentId=departmentId,
        )
    except Exception as e:
        app.logger.error(f"Error fetching grievances: {traceback.format_exc()}")
        flash("Unable to fetch grievances", "danger")
        return render_template(
            "grievance/admin/grievances_list.html",
            grievancesPagination=grievancesPagination,
            grievancesList=grievancesList,
            departmentsList=departmentsList,
            redirectval=redirectval,
            departmentId=departmentId,
        )


@grievances.route("/update_grievance", methods=["POST"])
def update_grievance():
    if not session.get("GrievanceAdminId"):
        flash("Unauthorized access", "danger")
        return redirect(url_for("grievances.grievances_list"))

    grievance_id = request.args.get("grievanceId")
    new_status = request.args.get("status")

    if not grievance_id or new_status not in ["0", "1", "2"]:
        flash("Invalid grievance update request", "danger")
        return redirect(url_for("grievances.grievances_list"))

    try:
        grievance = Grievances.objects(id=grievance_id).first()
        if not grievance:
            flash("Grievance not found", "danger")
            return redirect(url_for("grievances.grievances_list"))

        # Update status without deleting the record
        grievance.update(status=int(new_status))

        flash("Grievance status updated successfully", "success")
        return redirect(url_for("grievances.grievances_list"))
    except Exception as e:
        app.logger.error(f"Error updating grievance status: {e}")
        flash("Failed to update grievance status", "danger")
        return redirect(url_for("grievances.grievances_list"))