from appservices.common.util import *

api_document_guide = Blueprint("api_document_guide",__name__)

@api_document_guide.route("/api_document_guides_list",methods=["POST","GET"])
def api_document_guides_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    apiDocumentGuidesList = []
    
    adminId = session.get("adminId")
    try:
        redirectto = request.args.get('redirectto','apiDocumentGuide')
        if redirectto:
            redirectval=redirectto
        else:
            redirectval="apiDocumentGuide"

        search_element = request.form.get("search_element","")

        api_docs_guide_queryset = ApiDocumentGuide.objects(status__in=[0,1]).order_by("-id")
        if search_element:
            api_docs_guide_queryset = api_docs_guide_queryset.filter(Q(title__icontains=search_element))

        for each_api_document in api_docs_guide_queryset:
            apiDocumentGuideDict = fetching_api_document_guide_details(each_api_document)
            apiDocumentGuidesList.append(apiDocumentGuideDict)

        return render_template("super_admin_templates/api_document_guides_list.html",
            apiDocumentGuidesList=apiDocumentGuidesList,
            search_element=search_element,
            redirectval=redirectval
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch api guide document details!!"
        return render_template("super_admin_templates/api_document_guides_list.html", 
            error=error,
            apiDocumentGuidesList=apiDocumentGuidesList,
            search_element=search_element,
            redirectval=redirectval
            )


@api_document_guide.route("/add_api_document_guide",methods=["POST","GET"])
def add_api_document_guide():
    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()
        
        if request.method == "POST":
            title = request.form.get("title","")
            description = request.form.get("description","")
            multipleImages = request.files.getlist("multipleImages[]")
            priority = request.form.get("priority")

            jsonData = request.form.to_dict(flat=True)
            requestData = [jsonData]
            updatedrequestData = [jsonData]

            if title and description and priority:
                try:
                    admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                    if admin_queryset:
                        message=admin_queryset.userName+" "+title+" Api document guide created successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_api_document_guide","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
                    api_doc_guide_table = ApiDocumentGuide(
                        adminId = adminId,
                        title = title,
                        description = description,
                        priority = priority,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = api_doc_guide_table.save()

                    if multipleImages:
                        # Ensure the directory exists
                        upload_dir = os.path.join(app.config['SITE_ROOT'], "media/apiDocumentGuide/")
                        if not os.path.exists(upload_dir):
                            os.makedirs(upload_dir)

                        # List to hold all uploaded file paths
                        uploaded_files = []

                        # Iterate over the uploaded files
                        for each_image in multipleImages:
                            if each_image:
                                filename = secure_filename(each_image.filename)
                                unique_filename = f"{str(get_epoch_milli_time())}_{filename}"
                                save_path = os.path.join(upload_dir, unique_filename)
                                each_image.save(save_path)
                                uploaded_files.append(f"media/apiDocumentGuide/{unique_filename}")
                        # Assuming save_table is the object you are updating
                        save_table.update(multipleImages=uploaded_files)

                    flash("Api document guide saved successfully!")
                    return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
                except Exception as e:
                    flash("Unable to save api document guide!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save sub payment mode!!"
        return render_template("super_admin_templates/api_document_guides_list.html",error=error)


@api_document_guide.route("/update_api_document_guide",methods=["POST","GET"])
def update_api_document_guide():
    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()
    try:
        apiDocumentGuideId = request.args.get("apiDocumentGuideId","")
        if request.method == "POST":
            title = request.form.get("title","")
            description = request.form.get("description","")
            priority = request.form.get("priority")
            multipleImages = request.files.getlist("multipleImages[]")

            jsonData = request.form.to_dict(flat=True)

            if apiDocumentGuideId:
                api_document_guide_queryset = ApiDocumentGuide.objects(id=apiDocumentGuideId,status__in=[0,1]).first()
                existing_record = api_document_guide_queryset.to_json()
                message=api_document_guide_queryset.adminId.userName+" "+title+" Api document guide updated successfully!"
                requestData=[existing_record]
                updatedrequestData=[jsonData]
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_api_document_guide","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

                if api_document_guide_queryset:
                    api_document_guide_queryset.update(
                        title=title,
                        description=description,
                        priority=priority
                        )
                    if multipleImages:
                        # Ensure the directory exists
                        upload_dir = os.path.join(app.config['SITE_ROOT'], "media/apiDocumentGuide/")
                        if not os.path.exists(upload_dir):
                            os.makedirs(upload_dir)

                        # List to hold all uploaded file paths
                        uploaded_files = []

                        # Iterate over the uploaded files
                        for each_image in multipleImages:
                            if each_image:
                                filename = secure_filename(each_image.filename)
                                unique_filename = f"{str(get_epoch_milli_time())}_{filename}"
                                save_path = os.path.join(upload_dir, unique_filename)
                                each_image.save(save_path)
                                uploaded_files.append(f"media/apiDocumentGuide/{unique_filename}")

                        # Retrieve existing images if any and append the new uploaded files
                        existing_files = api_document_guide_queryset.multipleImages or []
                        uploaded_files.extend(existing_files)

                        api_document_guide_queryset.update(multipleImages=uploaded_files)


                    flash("Api document guide updated successfully!")
                    return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update api document guide details!!"
        return redirect(url_for("api_document_guide.api_document_guides_list",error=error))


@api_document_guide.route("/update_api_document_guide_status",methods=["POST","GET"])
def update_api_document_guide_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]
    apiDocumentGuideId = request.args.get("apiDocumentGuideId","")

    if apiDocumentGuideId:
        try:
            api_document_guide_queryset = ApiDocumentGuide.objects(id=apiDocumentGuideId,status__in=[0,1]).first()
            existing_record = api_document_guide_queryset.to_json()
            requestData = [existing_record]
            if api_document_guide_queryset:
                if api_document_guide_queryset.status == 0:
                    api_document_guide_queryset.update(status=1)
                    flash("Api document guide activated successfully!")
                    message=api_document_guide_queryset.adminId.userName+" "+api_document_guide_queryset.title+" Api document guide activated successfully!"
                elif api_document_guide_queryset.status == 1:
                    api_document_guide_queryset.update(status=0)
                    flash("Api document guide deactivated successfully!")
                    message=api_document_guide_queryset.adminId.userName+" "+api_document_guide_queryset.title+" Api document guide deactivated successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_api_document_guide_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
    else:
        flash("Required field is missing!!")
        return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))


@api_document_guide.route("/delete_api_document_guide",methods=["POST","GET"])
def delete_api_document_guide():
    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)

    updatedrequestData = [jsonData]
    apiDocumentGuideId = request.args.get("apiDocumentGuideId","")

    if apiDocumentGuideId:
        try:
            api_document_guide_queryset = ApiDocumentGuide.objects(id=apiDocumentGuideId,status__in=[0,1]).first()
            existing_record = api_document_guide_queryset.to_json()
            requestData = [existing_record]
            if api_document_guide_queryset:
                api_document_guide_queryset.update(status=2)
                flash("Api document guide deleted successfully!")
                message=api_document_guide_queryset.adminId.userName+" "+api_document_guide_queryset.title+" Api document guide deleted successfully!"
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_api_document_guide","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
                return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("api_document_guide.api_document_guides_list",redirectto="apiDocumentGuide"))
    else:
        flash("Required field is missing!!")
        return redirect(url_for("api_document_guide.api_document_guides_list"))


@api_document_guide.route("/remove_image",methods=["POST","GET"])
def remove_image():
    apiDocumentGuideId = request.form.get("api_id","")
    image = request.form.get("image","")
    data_status={'status':0,'result':""}
    if apiDocumentGuideId and image:
        try:
            new_image=image.replace(domain,'')
            api_document_guide_queryset = ApiDocumentGuide.objects(id=apiDocumentGuideId,status__in=[0,1]).first()
            if api_document_guide_queryset:
                uploaded_files = []
                existing_files = api_document_guide_queryset.multipleImages or []
                for each_image in existing_files:
                    if each_image != new_image:
                        uploaded_files.append(f"{each_image}")
                api_document_guide_queryset.update(multipleImages=uploaded_files)
                data_status['status']=1
                data_status['result']="success"
                return data_status
            else:
                data_status['result']="success"
                return data_status
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return data_status
    else:
        return data_status
