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

api_document_guide = Blueprint("api_document_guide",__name__)


@api_document_guide.route("/api_document_guides_list",methods=["POST","GET"])
@adminid_access_token_required
def api_document_guides_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    apiDocumentGuidesList = []
    pagination = ""
    snoCount = 0
    page = None
    total_count = 0
    
    adminId = session.get("adminId")
    permissionsList = check_permissions(session.get("adminId"),"apiDocumentGuidePermissions")
    form = ApIDocumentationGuideFormSearch(request.args)
    if "view" in permissionsList:
        try:
            redirectto = request.args.get('redirectto','apiDocumentGuide')
            if redirectto:
                redirectval=redirectto
            else:
                redirectval="apiDocumentGuide"

            search_element = request.args.get("search_element","")

            if search_element:

                search_element = form.search_element.data.strip()
            
            ApIDocumentationGuidePage = request.args.get(get_page_parameter("ApIDocumentationGuidePage"), type=int, default=1)
            per_page = 20
            start = (ApIDocumentationGuidePage - 1) * per_page

            print(ApIDocumentationGuidePage,"ApIDocumentationGuidePage")
            print(per_page,"per_page")
            print(start,"start")
            print(ApIDocumentationGuidePage,"ApIDocumentationGuidePage")
  



            filters = Q(status__in=[0, 1])
            # api_docs_guide_queryset = ApiDocumentGuide.objects(status__in=[0,1]).order_by("-id")
            if form.validate():
                if search_element and search_element.strip():
                    filters &= Q(title__icontains=search_element.strip())

                total_count = ApiDocumentGuide.objects(filters).count()

                api_document_guide_queryset = (
                    ApiDocumentGuide.objects(filters)
                    .only("id", "title","description", "priority","multipleImages", "createdOn", "status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                apiDocumentGuidesList = list(api_document_guide_queryset)

            else:
                print("form errors",form.errors)
                apiDocumentGuidesList = []


            snoCount = start
            pagination = Pagination(ApIDocumentationGuidePage=ApIDocumentationGuidePage, total=total_count, page_parameter="ApIDocumentationGuidePage", per_page=per_page, alignment="right", record_name="ApiDocumentGuide", href=f"?search_element={search_element}&ApIDocumentationGuidePage={{0}}")

            return render_template("super_admin_templates/api_document_guides_list.html",
                apiDocumentGuidesList=apiDocumentGuidesList,
                search_element=search_element,
                redirectval=redirectval,
                pagination = pagination,
                snoCount=snoCount,
                ApIDocumentationGuidePage=ApIDocumentationGuidePage,
                form=form

                )
        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,
                pagination = pagination,
                snoCount=snoCount,
                ApIDocumentationGuidePage=ApIDocumentationGuidePage,
                form=form
                )
    else:
        flash("The staff member does not have permission to view Api Document Guide!", "danger")
        return redirect(url_for("admin.dashboard"))


@api_document_guide.route("/add_api_document_guide",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_api_document_guide():
    data_status = {"responseStatus": 0, "result": ""}

    try:
        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:
            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,"apiDocumentGuidePermissions")
        form = ApIDocumentationGuideForm(request.form)
        if "add" in permissionsList:
            if request.method == "POST":
                title = request.form.get("title","")
                description = request.form.get("description","")
                multipleImages = request.files.getlist("multipleImages")
                priority = request.form.get("priority")
                print("11111111111111111111111111111111111111111111",request.form)
                print("22222222222222222222222222222222222222",title,priority)


                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]

                if form.validate_on_submit():
                
                    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,latitude,longitude) 
                        api_doc_guide_table = ApiDocumentGuide(
                            adminId = adminId,
                            title = title,
                            description = description,
                            priority = priority,
                            multipleImages = multipleImages,
                            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)
                        
                        
                        data_status["responseStatus"] = 1
                        flash("Api document guide saved successfully!", "success")
                        return data_status

                
                    except Exception as e:
                        data_status["responseStatus"] = 4
                        flash("Unable to save api document guide!", "error")
                        return data_status              
                
                else:
                    data_status['result']=form.errors
                    print("33333333333333333333333333333333",form.errors)
                    return data_status             
                
            else:
                flash("Invalid request .plz try again","error")
                data_status["responseStatus"] = 4
                  
                return data_status
        else:
            flash("The staff member does not have permission to create a Api document guide.", "danger")
            data_status["responseStatus"] = 4
            return data_status
           
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save sub payment mode!!"
        flash(error,"error")
        data_status["responseStatus"] = 4
        return data_status


@api_document_guide.route("/update_api_document_guide",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_api_document_guide():
    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:
        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:
        permissionsList = check_permissions(session.get("adminId"),"apiDocumentGuidePermissions")
        if "edit" in permissionsList:
            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)
                form = ApIDocumentationGuideForm(request.form)

                if form.validate_on_submit():

                    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,latitude,longitude) 

                        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)


                            data_status["responseStatus"]=1
                            flash("Api document guide 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"] = 2
                flash("Required fields are missing!!")
                return data_status
        else:
            flash("The staff member does not have permission to update Api document guide.", "danger")
            data_status["responseStatus"] = 4
            return data_status
            
    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"])
@adminid_access_token_required
def update_api_document_guide_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    
    adminId = session.get("adminId")
    search_element = request.args.get("search_element")
    ApIDocumentationGuidePage = request.args.get("ApIDocumentationGuidePage")
    redirectTo = url_for("api_document_guide.api_document_guides_list", ApIDocumentationGuidePage=ApIDocumentationGuidePage, search_element=search_element)
    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
    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"), "apiDocumentGuidePermissions")
    if "edit" in permissionsList:
        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,latitude,longitude)
                    return redirect(redirectTo)
                else:
                    flash("Invalid ID!!")
                    return redirect(redirectTo)
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(redirectTo)
        else:
            flash("Required field is missing!!")
            return redirect(redirectTo)
    else:
        flash("The staff member does not have permission to update Api document guide status.", "danger")
        return redirect(redirectTo)


@api_document_guide.route("/delete_api_document_guide",methods=["POST","GET"])
@adminid_access_token_required
def delete_api_document_guide():
    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]

    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]
    
    permissionsList = check_permissions(session.get("adminId"),"apiDocumentGuidePermissions")
    if "delete" in permissionsList:
        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,latitude,longitude)
                    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"))
    else:
        flash("The staff member does not have permission to delete Api document guide.", "danger")
        return redirect(url_for("api_document_guide.api_document_guides_list",redirectTo="apiDocumentGuide"))


@api_document_guide.route("/remove_image",methods=["POST","GET"])
@adminid_access_token_required
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
