from appservices.common.util import *
from appservices.common.form_schemas import *

admin_ipAddress = Blueprint("admin_ipAddress",__name__)


class CreateAdminIPAddressForm(FlaskForm):
    ipAddress = StringField('',validators=[DataRequired(), Length(min=1, max=16,message="IP Address must be between 1 and 16 characters"),Regexp(r'^\d+(\.\d+)*$', message="IP Address contains only numeric characters and allows multiple dots.")])

    def __init__(self, *args, current_id=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.current_id = str(current_id) if current_id else None
        # self.process(*args, **kwargs)
 
    def validate_ipAddress(self, field):
        existing = AdminIpAdress.objects(ipAddress=field.data,status__in=[0,1]).first()
        if existing and str(existing.id) != self.current_id:
            raise ValidationError('IP Address already exists.')
    class Meta:
        csrf = False

@admin_ipAddress.route("/create_admin_ip_address",methods=["POST","GET"])
@adminid_access_token_required
def create_admin_ip_address():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        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

        createdOn=datetime.datetime.now()

        permissionsList = check_permissions(adminId,"adminIpAddressPermission")
        if "add" in permissionsList:
            if request.method == "POST":
                ipAddress = request.form.get("ipAddress","")
                otp_check_id = request.form.get("otpCheckId", "")
                # defaultVerificationId = request.form.get("defaultVerificationId", "")
                print("otp_check_id",otp_check_id,"invalid request")
                if not otp_check_id:
                    flash("Invalid Request.")
                    return redirect(url_for("admin_ipAddress.get_admin_ip_address"))
            
                otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()
            
                if not otpcheck_queryset:
                    flash("Invalid Request.")
                    return redirect(url_for("admin_ipAddress.get_admin_ip_address"))
                # Update OTP status to 2 after verification
                otpcheck_queryset.update(status=2)

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                form = CreateAdminIPAddressForm()

                if form.validate_on_submit():


                    if ipAddress:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message = "Successfully created Admin IpAddress"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"create_admin_ip_address","create",createdOn,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                            
                            create_admin_ip_address_table = AdminIpAdress(
                                createdBy = adminId,
                                ipAddress = ipAddress,
                                otpCheckId = otp_check_id,
                                createdOn = datetime.datetime.now(),
                                status = 1,

                            )
                            create_admin_ip_address_table.save()
                            flash("Admin IpAddress created successfully!")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                                flash("Unable to create Admin IpAddress!!")
                                app.logger.error(traceback.format_exc())
                                data_status['responseStatus']=4
                                return data_status
                    else:
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status
                else:
                    data_status['result']=form.errors
                    return data_status
            else:
                data_status['responseStatus']=4
                return data_status
        else:   
            flash("The staff member does not have permission to create admin ip address.", "danger")
            data_status['responseStatus']=4
            return data_status

    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to create admin Ip Address!"
        flash(error)
        data_status['responseStatus']=4
        return data_status
    


@admin_ipAddress.route("/delete_admin_ip_address",methods=["POST","GET"])
@adminid_access_token_required
def delete_admin_ip_address():
    try:
        existing_record=""
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        
        latitude = request.form.get("latitude", "")
        longitude = request.form.get("longitude", "")
        loginBrowser = request.headers.get("Sec-Ch-Ua")
        if loginBrowser:
            loginBrowseData = loginBrowser.split(";")
            browser = loginBrowseData[0]
        else:
            loginBrowseData = request.headers.get('User-Agent').split(";")
            browser = loginBrowseData[0]
        
        client_ip=0
        # Extracting client IP address
        if request.headers.getlist("X-Forwarded-For"): 
            client_ip = request.headers.getlist("X-Forwarded-For")[0]
        else:
            client_ip = request.remote_addr

        actionDate=datetime.datetime.now()

        jsonData = request.form.to_dict(flat=True)

        requestData = [existing_record]
        updatedrequestData = [jsonData]

        adminIpAddressPage = 1
        
        permissionsList = check_permissions(session.get("adminId"),"adminIpAddressPermission")
        if "delete" in permissionsList:
            if request.method == "POST":
                otp_check_id = request.form.get("otpLogid", "")

                if not otp_check_id:
                    flash("Invalid Request.")
                    return redirect(url_for("admin_ipAddress.get_admin_ip_address"))
                
                otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()
                
                if not otpcheck_queryset:
                    flash("Invalid Request.")
                    return redirect(url_for("admin_ipAddress.get_admin_ip_address"))
                # Update OTP status to 2 after verification
                otpcheck_queryset.update(status=2)

            adminIpAddressId = request.args.get("adminIpAddressId","")
            adminIpAddressPage = request.args.get(get_page_parameter("adminIpAddressPage"), type=int, default=1)
            admin_ip_address_queryset = AdminIpAdress.objects(id=adminIpAddressId,status__in=[0,1]).first()
            if admin_ip_address_queryset:
                # admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                existing_record = admin_ip_address_queryset.to_json()
                requestData = [existing_record]
                admin_ip_address_queryset.update(status=2)
                flash("IP Address deleted successfully!")
                message=admin_ip_address_queryset.createdBy.userName+" Admin IpAddress deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_admin_ip_address","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(url_for("admin_ipAddress.get_admin_ip_address",adminIpAddressPage=adminIpAddressPage))
            else:
                flash("Invalid Request.")
                return redirect(url_for("admin_ipAddress.get_admin_ip_address",adminIpAddressPage=adminIpAddressPage))
        else:
            flash("Staff member does not have permission to delete admin ip address!!", "danger")
            return redirect(url_for("admin_ipAddress.get_admin_ip_address"))
            

    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete IP Address. Please try again.", "danger")
        return redirect(url_for("admin_ipAddress.get_admin_ip_address",adminIpAddressPage=adminIpAddressPage))
    



@admin_ipAddress.route("/get_admin_ip_address",methods=["POST","GET"])
@adminid_access_token_required
def get_admin_ip_address():
    if not session.get("adminId"):
        return redirect("admin_login")

    adminIpAddressList = []   
    adminIpAddressPage=None 
    pagination=""
    redirectval=""
    snoCount=0

    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"adminIpAddressPermission")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = ""

            adminIpAddressPage = request.args.get(get_page_parameter("adminIpAddressPage"), type=int, default=1)
            per_page = 20
            start = (adminIpAddressPage - 1) * per_page

            total_count=0
            filters = Q(status__in=[0, 1])

            total_count = AdminIpAdress.objects(filters).count()

            admin_ipAddress_queryset = (
                    AdminIpAdress.objects(filters)
                    .only("id","createdBy","ipAddress","createdOn","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
            )

            snoCount = start

            adminIpAddressList = list(admin_ipAddress_queryset)

            pagination = Pagination(adminIpAddressPage=adminIpAddressPage, total=total_count, per_page=per_page, page_parameter ="adminIpAddressPage", alignment="right", record_name="adminIpAddress")

            return render_template("super_admin_templates/admin_ip_address_list.html",
                pagination=pagination,
                adminIpAddressList=adminIpAddressList,
                redirectval=redirectval,
                snoCount = snoCount,
                adminIpAddressPage = adminIpAddressPage,
            )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch Admin IP Address details!!"
            return render_template("super_admin_templates/admin_ip_address_list.html", 
                error=error,
                pagination=pagination,
                redirectval=redirectval,
                adminIpAddressList=adminIpAddressList,
                snoCount = snoCount,
                adminIpAddressPage = adminIpAddressPage,
            )
    else:
        flash("The staff member does not have permission to view admin ip address!", "danger")
        return redirect(url_for("admin.dashboard"))