from appservices.common.util 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"])
def admin_banners_list():
    if not session.get("adminId"):
        return redirect("admin_login")

    bannersList = []
    adminId = session.get("adminId")
    permissionsList = check_permissions(adminId, "bannersPermissions")

    if "view" in permissionsList:
        try:
            # Fetch banners
            redirectTo = request.args.get("redirectTo","Banners")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "Banners"
            search_element = request.form.get("search_element","")


            banners_queryset = AdminBanners.objects(status__in=[0,1]).order_by("-id")
            if search_element:
                banners_queryset = banners_queryset.filter(Q(name__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 = banners_queryset.count()

            start = (page - 1) * per_page

            end = min(start + per_page, total_count)

            total_banners = banners_queryset[start:end]
            
            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",
            bannersList=bannersList,
            pagination=pagination,
            redirectval=redirectval,
            search_element=search_element
              )
        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
            )
    else:
        flash("Staff member does not have given view banner permissions!!")
        return render_template("super_admin_templates/admin_banners.html")


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

    if "add" in permissionsList:
        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))))))))))))")
            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) 
                # 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:
                    print(image,"((((((((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")

                flash("Banner saved successfully!")
                return redirect(url_for("admin_banners.admin_banners_list"))

            except Exception as e:
                flash("Unable to save banner!")
                app.logger.error(traceback.format_exc())
                return redirect(url_for("admin_banners.admin_banners_list"))

    else:
        flash("Staff member does not have given create banner permissions!")
        return redirect(url_for("admin_banners.admin_banners_list"))

# @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"])
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:
        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","")


                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)

                    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 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")

                        flash("Master bank updated successfully!")
                        return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
                    else:
                        flash("Invaild id!!")
                        return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
                else:
                    flash("Required fields are missing!!")
                    return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
        else:
            flash("Staff member does not have given update bank permissions!!")
            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"])
def admin_delete_banner():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        permissionsList = check_permissions(session.get("adminId"),"bannersPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                bannerId = request.args.get("bannerId","")
                banner_queryset = AdminBanners.objects(id=bannerId,status__in=[0,1]).first()
                banner_queryset.update(status=2)
                flash("Banner deleted successfully!")
                return redirect(url_for("admin_banners.admin_banners_list"))
        else:
            flash("Staff member does not have given delete banner permissions!!")
            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"])
def admin_banner_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"bannersPermissions")
    if "edit" in permissionsList:
        bannerId = request.args.get("bannerId","")

        if bannerId:
            try:
                banners_queryset = AdminBanners.objects(id=bannerId,status__nin=[2]).first()
                if banners_queryset:
                    if banners_queryset.status == 0:
                        banners_queryset.update(status=1)
                        flash("Banner activated successfully!")
                    elif banners_queryset.status == 1:
                        banners_queryset.update(status=0)
                        flash("Banner deactivated successfully!")
                    return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
        else:
            return redirect(url_for("admin_banners.admin_banners_list",redirectTo="Banners"))
    else:
        flash("Staff member does not have given update status banners permissions!!")
        return redirect(url_for("admin_banners.admin_banners_list"))




