from appservices.common.util import *

service_charges = Blueprint("service_charges",__name__)


def fetching_service_charges_details(service_charge_queryset):
    service_charge_dict = {}
    try:
        service_charge_dict={
        "id":str(service_charge_queryset.id),
        "chargeType":service_charge_queryset.chargeType,
        "amountType":service_charge_queryset.amountType,
        "amount":service_charge_queryset.amount,
        "gstInclude":service_charge_queryset.gstInclude,
        "gstValue":service_charge_queryset.gstValue,
        "tdsInclude":service_charge_queryset.tdsInclude,
        "tdsValue":service_charge_queryset.tdsValue,
        }
        if service_charge_queryset.status==1:
            service_charge_dict["actionText"] = "Active"
        else:
            service_charge_dict["actionText"] = "Deactive"

        if service_charge_queryset.createdOn:
            service_charge_dict["createdOn"] = service_charge_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
        else:
            service_charge_queryset["createdOn"] = ""
            
         
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return service_charge_dict


@service_charges.route("/get_service_charge_list",methods=["POST","GET"])
def get_service_charge_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    serviceChargeList = []
    pagination = None
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"bankPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","serviceCharges")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "serviceCharges"
            search_element = request.args.get("search_element","")


            service_charges_queryset = ServiceCharges.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                service_charges_queryset = service_charges_queryset.filter(Q(chargeType__icontains=search_element))


            # 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 = service_charges_queryset.count()

            start = (page - 1) * per_page

            end = min(start + per_page, total_count)

            total_service_charges = service_charges_queryset[start:end]
            
            snoCount = start
            for each_service_charge in total_service_charges:
                snoCount +=1
                service_charge_dict = fetching_service_charges_details(each_service_charge)
                service_charge_dict["snoCount"]=snoCount
                serviceChargeList.append(service_charge_dict)

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

            return render_template("super_admin_templates/service_charges_list.html",
                pagination=pagination,
                serviceChargeList=serviceChargeList,
                redirectval=redirectval,
                search_element=search_element
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch service charge details!!"
            return render_template("super_admin_templates/service_charges_list.html", 
                error=error,
                pagination=pagination,
                serviceChargeList=serviceChargeList,
                search_element=search_element
                )
    else:
        flash("Staff member does not have given view service charge permissions!!")
        return redirect(url_for("admin.dashboard"))
        # return render_template("super_admin_templates/bank_masters_list.html"

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

        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]

        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()
        

        permissionsList = check_permissions(adminId,"bankPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                action = request.form.get("action", "HI").strip()
                data = request.form.to_dict()
                # Step 1: Handle OTP Generation
                if action == "generate":
                    mail_type = data.get("mailType", "").strip()
                    print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                    if not mail_type:
                        return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                    return jsonify(generate_otp_helper(mail_type))

                # tep 2: Handle OTP Verification
                elif action == "verify":
                    otp_check_id = request.form.get("otpCheckId","SAI")
                    otp_code = request.form.get("otpCode","K")

                    print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                    print(otp_code,"((((((((OTP CODE????????????))))))))")

                    if not otp_check_id or not otp_code:
                        return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                    return jsonify(verify_otp_helper(otp_check_id, otp_code))

                elif action == "update":
                    otp_check_id = request.form.get("otpCheckId", "")
                    otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                    admin_id = request.form.get("adminId", "")

                    otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
                   
                    if not otpcheck_queryset:
                        return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                    # Update OTP status to 2 after verification
                    otpcheck_queryset.update(status=2)
                    return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

                chargeType = request.form.get("chargeType","")
                amountType = request.form.get("amountType","")
                amount = request.form.get("amount","")
                gstInclude = request.form.get("gstInclude","")
                gstValue = request.form.get("gstValue",0)
                tdsInclude = request.form.get("tdsInclude","")
                tdsValue = request.form.get("tdsValue",0)
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if chargeType and amountType and amount: 
                    try:
                        admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                        if admin_queryset:
                            message=admin_queryset.userName+" "+chargeType+" service charges created successfully!"
                            save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_service_charges","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                            

                        service_charge_table = ServiceCharges(
                            adminId=adminId,
                            chargeType=chargeType,
                            amountType = amountType,
                            amount = amount,
                            gstInclude = gstInclude,
                            gstValue = gstValue,
                            tdsInclude = tdsInclude,
                            tdsValue = tdsValue,
                            createdOn = datetime.datetime.now(),
                            status = 1,
                            )
                        save_table = service_charge_table.save()
                        serviceChargeId = str(save_table.id)

                        flash("Service Charges saved successfully!")
                        return redirect(url_for("service_charges.get_service_charge_list"))
                    except Exception as e:
                        flash("Unable to save service charge details!!")
                        app.logger.error(traceback.format_exc())
                        return redirect(url_for("service_charges.get_service_charge_list"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("service_charges.get_service_charge_list"))
        else:
            flash("Staff member does not have given create service charge permissions!!")
            return redirect(url_for("service_charges.get_service_charge_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save service charge details!!"
        return render_template("super_admin_templates/service_charges_list.html",error=error)


#Update master IFSC bank


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

    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    existing_record = ""
    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()
    jsonData = request.form.to_dict(flat=True)
    serviceChargeId = request.args.get("serviceChargeId","")
    
    try:
        permissionsList = check_permissions(session.get("adminId"),"bankPermissions")
        if "edit" in permissionsList:               
            serviceChargeId = request.args.get("serviceChargeId","")
            if request.method == "POST":
                action = request.form.get("action", "HI").strip()
                data = request.form.to_dict()
                # Step 1: Handle OTP Generation
                if action == "generate":
                    mail_type = data.get("mailType", "").strip()
                    print(mail_type,"((((((((((((((((mail_type))))))))))))))))")
                    if not mail_type:
                        return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400


                    return jsonify(generate_otp_helper(mail_type))

                # tep 2: Handle OTP Verification
                elif action == "verify":
                    otp_check_id = request.form.get("otpCheckId","SAI")
                    otp_code = request.form.get("otpCode","K")

                    print(otp_check_id,"((((((((OTP CHECK ID????????????))))))))")
                    print(otp_code,"((((((((OTP CODE????????????))))))))")

                    if not otp_check_id or not otp_code:
                        return jsonify({"responseStatus": 0, "result": "Required fields are missing!"})

                    return jsonify(verify_otp_helper(otp_check_id, otp_code))

                elif action == "update":
                    otp_check_id = request.form.get("otpCheckId", "")
                    otp_record = OtpChecks.objects(id=otp_check_id, status=1).first()
                    admin_id = request.form.get("adminId", "")

                    otpcheck_queryset = OtpChecks.objects(adminId=str(admin_id), id=str(otp_check_id), status=1).first()
                   
                    if not otpcheck_queryset:
                        return jsonify({"responseStatus": 0, "result": "Invalid Request."})
                    # Update OTP status to 2 after verification
                    otpcheck_queryset.update(status=2)
                    return jsonify({"responseStatus": 1, "result": "OTP status successfully updated!"})

                chargeType = request.form.get("chargeType","")
                amountType = request.form.get("amountType","")
                amount = request.form.get("amount","")
                gstInclude = request.form.get("gstInclude","")
                gstValue = request.form.get("gstValue")
                tdsInclude = request.form.get("tdsInclude","")
                tdsValue = request.form.get("tdsValue",0)
                remark = request.form.get("remark","")   
                print(chargeType,"(((((((((((chargeType)))))))))))")
                print(amountType,"(((((((((((amountType)))))))))))")
                print(amount,"(((((((((((amount)))))))))))")
                if chargeType and amountType and amount:
                    service_charges_queryset = ServiceCharges.objects(id=serviceChargeId, status__in=[0, 1]).first()
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    existing_record = service_charges_queryset.to_json()
                    message=admin_queryset.userName+" "+chargeType+" service charges updated successfully!"
                    requestData=[service_charges_queryset]
                    updatedrequestData=[jsonData]
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_service_charges","update",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    save_remarks_data=save_admin_remarks_data(serviceChargeId,adminId,remark,"serviceCharges") 

                    if service_charges_queryset:
                        service_charges_queryset.update(
                            chargeType = chargeType,
                            amountType = amountType,
                            amount = amount,
                            gstInclude = gstInclude,
                            gstValue = gstValue,
                            tdsInclude = tdsInclude,
                            tdsValue = tdsValue,
                            )
                        
                        flash("service charges updated successfully!")
                        return redirect(url_for("service_charges.get_service_charge_list"))
                    else:
                        flash("Invalid ID!")
                        return redirect(url_for("service_charges.get_service_charge_list"))
                else:
                    flash("Required fields are missing!")
                    return redirect(url_for("service_charges.get_service_charge_list"))                       
            return redirect(url_for("service_charges.get_service_charge_list"))
        else:
            flash("Staff member does not have given update service charges permissions!!")
            return redirect(url_for("service_charges.get_service_charge_list"))

    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update service charges details!")
        return redirect(url_for("service_charges.get_service_charge_list"))


@service_charges.route("/update_service_charge_status",methods=["POST","GET"])
def update_service_charge_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    if loginBrowser:
        loginBrowseData = loginBrowser.split(";")
        browser = loginBrowseData[0]
    else:
        loginBrowseData = request.headers.get('User-Agent').split(";")
        browser = loginBrowseData[0]

    client_ip=0
    # Extracting client IP address
    if request.headers.getlist("X-Forwarded-For"): 
        client_ip = request.headers.getlist("X-Forwarded-For")[0]
    else:
        client_ip = request.remote_addr

    actionDate=datetime.datetime.now()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]

    permissionsList = check_permissions(session.get("adminId"),"bankPermissions")
    if "edit" in permissionsList:
        serviceChargeId = request.args.get("serviceChargeId","")
        remark = request.form.get("remark","")

        if serviceChargeId and remark:
            try:
                message=""
                service_charges_queryset = ServiceCharges.objects(id=serviceChargeId).first()
                existing_record = service_charges_queryset.to_json()
                requestData = [existing_record]
                if service_charges_queryset:
                    if service_charges_queryset.status == 0:
                        service_charges_queryset.update(status=1)
                        flash("Service Charges activated successfully!")
                        message=service_charges_queryset.adminId.userName+" "+service_charges_queryset.chargeType+" Service Charges activated successfully!"
                    elif service_charges_queryset.status == 1:
                        service_charges_queryset.update(status=0)
                        flash("Service Charges deactivated successfully!")
                        message=service_charges_queryset.adminId.userName+" "+service_charges_queryset.chargeType+" Service Charges deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_service_charge_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                    save_remarks_data=save_admin_remarks_data(serviceChargeId,adminId,remark,"serviceCharges")
                    return redirect(url_for("service_charges.get_service_charge_list"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("service_charges.get_service_charge_list"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("service_charges.get_service_charge_list"))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("service_charges.get_service_charge_list"))
    else:
        flash("Staff member does not have given status update service charge permissions!!")
        return redirect(url_for("service_charges.get_service_charge_list"))