from appservices.common.util import *
from appservices.common.form_schemas import *


admin_banners = Blueprint("admin_banners",__name__)

def admin_banners_details(each_banner):
    bannerDict = {}
    try:
        bannerDict = {
        "id": str(each_banner.id),
        "name": each_banner.name,
        "sorting": each_banner.sorting,
        "externalLink": each_banner.externalLink,
        "googleScript": each_banner.googleScript,
        "isBanner": each_banner.isBanner,
        "status":each_banner.status
        }
        if each_banner.image:
            bannerDict["image"]=domain+each_banner.image
        else:
            bannerDict["image"]=""    
        if each_banner.status == 1:
            bannerDict["actionText"]="Active"
        else:
            bannerDict["actionText"]="Deactive"

        try:
            if each_banner.isGrievance:
                bannerDict["isGrievance"]=each_banner.isGrievance
            else:
                bannerDict["isGrievance"]=False
        except Exception as e:
            bannerDict["isGrievance"]=False

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

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

    bannersList = []
    adminId = session.get("adminId")
    permissionsList = check_permissions(adminId, "bannersPermissions")
    snoCount = 0
    total_count = 0
    page = None
    pagination = ""
    form = BannersSearchForm(request.args)

    if "view" in permissionsList:
        try:

            redirectTo = request.args.get("redirectTo","Banners")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Banners"
            search_element = request.args.get("search_element","")



            # banners_queryset = AdminBanners.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                search_element = form.search_element.data.strip()

            page = request.args.get(get_page_parameter("page"), type=int, default=1)

            per_page = 20  

            # total_count = banners_queryset.count()

            start = (page - 1) * per_page

            # end = min(start + per_page, total_count)

            # total_banners = banners_queryset[start:end]
            filters = Q(status__in=[0, 1])

            if form.validate():
                if search_element and search_element.strip():
                    filters &= Q(name__icontains=search_element.strip())
                total_count = AdminBanners.objects(filters).count()

                banners_queryset = (
                    AdminBanners.objects(filters)
                    .only("id", "name","sorting", "isBanner","image", "externalLink", "googleScript","isGrievance","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )

                bannersList = list(banners_queryset)
            
            else: 
                print("form errors",form.errors)
                bannersList = []     


            snoCount = start  
            pagination = Pagination(page = page,total = total_count, page_parameter = "page",per_page=per_page,alignment = "right",
                    record_name="AdminBanners", href=f"?search_element={search_element}&page={{0}}")         
            
            # snoCount = start
            # for each_banner in total_banners:
            #     snoCount +=1
            #     bannerDict = admin_banners_details(each_banner)
            #     bannerDict["snoCount"]=snoCount
            #     bannersList.append(bannerDict)
            # pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="banners")
            # # banners_queryset = AdminBanners.objects(status__in=[0,1]).order_by("-sorting")
            # # for each_banner in banners_queryset:
            # #     bannerDict = admin_banners_details(each_banner)
            # #     bannersList.append(bannerDict)


            return render_template("super_admin_templates/admin_banners.html",
            page = page,
            bannersList=bannersList,
            pagination=pagination,
            redirectval=redirectval,
            search_element=search_element,
            snoCount=snoCount,
            form=form,
            domain = domain
              )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch banners details!!"
            return render_template("super_admin_templates/admin_banners.html",
            error=error,
            bannersList=bannersList,
            pagination=pagination,
            redirectval=redirectval,
            search_element=search_element,
            page = page, 
            snoCount=snoCount,
            form=form,
            domain = domain
            )
    else:
        flash("The staff member does not have permission to view banner", "danger")
        return render_template("super_admin_templates/admin_banners.html")
    

# class BannerForm(FlaskForm):
#     name = StringField('', validators=[
#         DataRequired(), Length(min=MIN_LENGTH_3, max=MAX_LENGTH_75, message=INVALID_LENGTH_MESSAGE),
#         Regexp(ALPHANUMERIC_REGEX, message="Name must be 3 to 75 characters long and can only contain letters, numbers, spaces, and special characters: @ # $ ( ) + _ - / .")
#     ])

#     googleScript = StringField('', validators=[
#         Optional(),
#         Length(min=MIN_LENGTH_1, max=MAX_LENGTH_150, message="Google Script must be between 1 and 150 characters."),Regexp(ALPHANUMERIC_REGEX, message="Google Script must be 1 to 150 characters long and can only contain letters, numbers, spaces, and special characters: @ # $ ( ) + _ - / .")

#     ])

#     sorting = IntegerField('', validators=[
#         DataRequired(),
#         IntegerField(min=MIN_LENGTH_1, max=MAX_LENGTH_150, message="Sorting must be between 1 and 150"),Regexp(ONLY_NUMERIC,message="Only Numeric allowed in Sorting")
#     ])

#     isGrievance = BooleanField('')  

#     isBanner = BooleanField('')

#     externalLink = StringField('', validators=[
#         Optional(),
#         Length(min=MIN_LENGTH_1, max=MAX_LENGTH_150,message = "External Link must be in 1 to 150 length only"),Regexp(ALPHANUMERIC_REGEX,message="External Link must be 1 to 150 characters long and can only contain letters, numbers, spaces, and special characters: @ # $ ( ) + _ - / .")
        
#     ])

#     image = FileField('', validators=[Optional(),FileAllowed(['jpg', 'jpeg', 'png'], INVALID_Image_MESSAGE)])

#     class Meta:
#         csrf = False

# class BannersSearchForm(FlaskForm):
#     search_element = StringField('', validators=[Optional(),Length(min=MIN_LENGTH_3, max=MAX_LENGTH_75),Regexp(ALPHANUMERIC_REGEX, message="Search Element must be 3 to 75 characters long and can only contain letters, numbers, spaces, and special characters: @ # $ ( ) + _ - / .")])
   
#     class Meta:
#         csrf = False 


# Add Banner
@admin_banners.route("/add_admin_banner", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def add_admin_banner():
    data_status = {"responseStatus": 0, "result": ""}
    if not session.get("adminId"):
        return redirect("admin_login")

    adminId = session.get("adminId")
    
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
    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:
        userAgent=request.headers.get('User-Agent')
        loginBrowseData = userAgent.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, "bannersPermissions")

    form = BannerForm(request.form)

    if "add" in permissionsList:
        try:
            if request.method == "POST":
                name = request.form.get("name", "")
                externalLink = request.form.get("externalLink", "")
                googleScript = request.form.get("googleScript", "")
                isBanner = request.form.get("isBanner")
                isGrievance = request.form.get("isGrievance")
                sorting = request.form.get("sorting", 1)
                image = request.files.get("image","")
                
            
                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]  
                print(externalLink,"((((((((((((externalLink))))))))))))")
                
                if form.validate_on_submit():
                    if name and sorting:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+name+" Banner created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_admin_banner","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                            # Create a new banner with imag
                            if isGrievance == "on":
                                isGrievance = True
                            else:
                                isGrievance = False

                            if isBanner == "on":
                                isBanner = True
                            else:
                                isBanner = False

                            banner_table = AdminBanners(
                                adminId=adminId,
                                name=name,
                                googleScript=googleScript,
                                sorting=sorting,
                                isGrievance=isGrievance,
                                isBanner=isBanner,
                                externalLink=externalLink,
                                createdOn=datetime.datetime.now(),
                                status=1
                            )
                            save_banner = banner_table.save()
                            bannerId = str(save_banner.id)

                            if image:
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/banners/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/banners/"))
                                save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/banners/"+bannerId+".png"))
                                print(save_file,"((((((????????))))))")
                                save_banner.update(image="media/banners/"+bannerId+".png")

                            data_status["responseStatus"] = 1
                            flash("Banner saved successfully!")
                            return data_status

                        except Exception as e:
                                data_status["responseStatus"] = 4
                                flash("Unable to save banner!", "error")
                                return data_status  
                    else: 
                        data_status['responseStatus']=2
                        data_status['result']="Required fields are missing!!"
                        return data_status


                else: 
                    data_status['result']=form.errors
                    print("",form.errors)
                    return data_status 
            else:
                data_status["responseStatus"] = 4
                    
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
    else:
        data_status["responseStatus"] = 4
        flash("The staff member does not have permission to create a banner.", "danger")
        return data_status

# @admin_banners.route("/admin_edit_banner", methods=["POST", "GET"])
# def admin_edit_banner():
#     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 = userAgent.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()

#     permissionsList = check_permissions(session.get("adminId"), "bannersPermissions")
#     if "edit" in permissionsList:
#         try:
#             banner_id = request.args.get("banner_id", "")
#             if request.method == "POST":
#                 # Retrieve form data
#                 name = request.form.get('name', "")
#                 sorting = request.form.get('sorting', 1)
#                 externalLink = request.form.get('externalLink', "")
#                 googleScript = request.form.get('googleScript', "")
#                 jsonData = request.form.to_dict(flat=True) 
#                 remark = request.form.get("remark","")
                
#                 # Checkbox handling
#                 isBanner = request.form.get('isBanner') == 'on'  # Set to True if checked, False otherwise

#                 if banner_id:
#                     # Fetch the banner object
#                     banner = AdminBanners.objects(id=banner_id).first()


#                     if banner:
#                         # Update fields
#                         banner.name = name
#                         banner.sorting = sorting
#                         banner.externalLink = externalLink
#                         banner.googleScript = googleScript
#                         banner.isBanner = isBanner

#                         # Handle image upload if present
#                         image_file = request.files.get('image', None)
#                         if image_file:
#                             # Save the new image
#                             if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/banners/")):
#                                 os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/banners/"))
#                             banner.image = os.path.join("media/banners", f"{banner_id}.png")  # Update image path
#                             image_file.save(os.path.join(app.config['SITE_ROOT'], banner.image))

#                         banner.save()
#                         flash("Banner updated successfully!")
#                         return redirect(url_for("admin_banners.admin_banners_list"))
#                     else:
#                         flash("Invalid banner ID!")
#                         return redirect(url_for("admin_banners.admin_banners_list"))
#                 else:
#                     flash("Required fields are missing!")
#                     return redirect(url_for("admin_banners.admin_banners_list"))
#             else:
#                 # If not a POST request, just show the current banner details (if needed)
#                 flash("You need to submit the form to update the banner.")
#                 return redirect(url_for("admin_banners.admin_banners_list"))

#         except Exception as e:
#             app.logger.error(traceback.format_exc())
#             flash("Unable to update banner details!", "danger")
#             return redirect(url_for("admin_banners.admin_banners_list"))
#     else:
#         flash("Staff member does not have the required edit permissions!", "danger")
#         return redirect(url_for("admin_banners.admin_banners_list"))


@admin_banners.route("/admin_edit_banner",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def admin_edit_banner():
    data_status = {"responseStatus": 0, "result": ""}
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId=session.get("adminId")    
    
    csrf_token = request.form.get("csrf_token")
    print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
    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:
        userAgent=request.headers.get('User-Agent')
        loginBrowseData = userAgent.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()

    try:
        permissionsList = check_permissions(session.get("adminId"),"bannersPermissions")
        if "edit" in permissionsList:
            bannerId = request.args.get("bannerId","")
            print("HIIII")
            if request.method == "POST":
                name = request.form.get("name","")
                sorting = request.form.get("sorting",1)
                externalLink = request.form.get("externalLink","")
                googleScript = request.form.get("googleScript","")
                isBanner = request.form.get("isBanner")
                isGrievance = request.form.get("isGrievance")
                image = request.files.get('image',"")
                jsonData = request.form.to_dict(flat=True)
                remark = request.form.get("remark","")

                form = BannerForm(request.form)


                if form.validate_on_submit():
                    if name:
                        banner_queryset = AdminBanners.objects(id=bannerId,status__in=[0,1]).first()
                        existing_record = banner_queryset.to_json()
                        message=banner_queryset.adminId.userName+" "+name+" banner updated successfully!"
                        requestData=[banner_queryset]
                        updatedrequestData=[jsonData]
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"admin_edit_banner","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)

                        if isGrievance == "on":
                            isGrievance = True
                        else:
                            isGrievance = False
                        if isBanner == "on":
                            isBanner = True
                        else:
                            isBanner = False
                        if banner_queryset:
                            banner_queryset.update(
                                name = name,
                                sorting = sorting,
                                isGrievance = isGrievance,
                                isBanner = isBanner,
                                externalLink = externalLink,
                                googleScript = googleScript,
                                )
                            
                            if image:
                                if not is_allowed_image(image.filename):
                                    flash("Invalid image format! Only JPG, JPEG, and PNG are allowed.")
                                    return redirect(url_for("admin_banners.admin_banners_list"))
                                if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/banners/")):
                                    os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/banners/"))
                                save_file = image.save(os.path.join(app.config['SITE_ROOT'], "media/banners/"+str(bannerId)+".png"))
                                banner_queryset.update(image="media/banners/"+str(bannerId)+".png")

                            data_status["responseStatus"]=1
                            flash("Master bank updated successfully!")
                            return data_status
                            
                        else:
                            flash("Invalid ID provided.", "danger")
                            data_status["responseStatus"]=4
                            return data_status
                    else:
                        flash("Invalid ID provided.", "danger")
                        data_status["responseStatus"]=4
                        return data_status
                else:
                    data_status["result"]=form.errors
                    return data_status
            else:
                data_status["responseStatus"]=4
                flash("Required fields are missing!!")
                return data_status

        else:
            flash("The staff member does not have permission to update Banners.", "danger")
            return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update master bank details!!"
        flash(error)
        return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))

# @admin_banners.route("/admin_delete_banner", methods=["POST"])
# def admin_delete_banner():
#     if not session.get("adminId"):
#         return redirect("admin_login")

#     banner_id = request.args.get("banner_id", "")  # Use query parameter instead of URL parameter

#     if banner_id:
#         try:
#             # Fetch the banner object
#             banner = AdminBanners.objects.get(id=banner_id)
#             banner.delete()
#             flash("Banner deleted successfully!", "success")
#         except Exception as e:
#             flash("Error deleting banner: " + str(e), "danger")
#     else:
#         flash("Required field is missing!", "danger")

#     return redirect(url_for("admin_banners.admin_banners_list"))



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

       
        latitude = request.args.get("latitude", "")
        longitude = request.args.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)

        existing_record = ""
        updatedrequestData = [jsonData]
        
        permissionsList = check_permissions(session.get("adminId"),"bannersPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                bannerId = request.args.get("bannerId","")
                banner_queryset = AdminBanners.objects(id=bannerId,status__in=[0,1]).first()
                existing_record = banner_queryset.to_json()
                requestData = [existing_record]
                banner_queryset.update(status=2)
                flash("Banner deleted successfully!")
                message=admin_queryset.userName+" "+banner_queryset.name+" Banner deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"admin_delete_banner","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(url_for("admin_banners.admin_banners_list"))
        else:
            flash("The staff member does not have permission to delete Banners.", "danger")
            return redirect(url_for("admin_banners.admin_banners_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete Banner!!")
        return redirect(url_for("admin_banners.admin_banners_list"))




@admin_banners.route("/admin_banner_status",methods=["POST","GET"])
@adminid_access_token_required
def admin_banner_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    loginBrowser = request.headers.get("Sec-Ch-Ua")
    latitude = request.args.get("latitude", "")
    longitude = request.args.get("longitude", "")
    page = request.args.get("page")
    search_element = request.args.get("search_element")

    redirectTo = url_for("admin_banners.admin_banners_list",page = page,search_element=search_element)

    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"),"bannersPermissions")
    if "edit" in permissionsList:
        bannerId = request.args.get("bannerId","")

        if bannerId:
            try:
                message=""
                banners_queryset = AdminBanners.objects(id=bannerId,status__nin=[2]).first()
                existing_record = banners_queryset.to_json()
                requestData = [existing_record]
                if banners_queryset:
                    if banners_queryset.status == 0:
                        banners_queryset.update(status=1)
                        flash("Banner activated successfully!")
                        message=banners_queryset.adminId.userName+" "+banners_queryset.name+" banner activated successfully!"
                    elif banners_queryset.status == 1:
                        banners_queryset.update(status=0)
                        flash("Banner deactivated successfully!")
                        message=banners_queryset.adminId.userName+" "+banners_queryset.name+" banner deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"admin_banner_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print(save_admin_log_table,"((((((((((((((((save_admin_log_table))))))))))))))))")
                    return redirect(redirectTo)
                else:
                    flash("Invaild id!!")
                    return redirect(redirectTo)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            return redirect(redirectTo)
    else:
        flash("The staff member does not have permission to update banners status.", "danger")
        return redirect(redirectTo)




