from appservices.common.util import *
from appservices.common.form_schemas import *

documents = Blueprint("documents",__name__)


# @documents.route("/create_document",methods=["POST","GET"])
# def create_document():
#     try:
#         if not session.get("adminId"):
#             return redirect("admin_login")
#         adminId = session.get("adminId")
#         # permissionsList = check_permissions(adminId,"bankPermissions")
#         # if "add" in permissionsList:
#         if request.method == "GET":
#             return render_template("super_admin_templates/create_document.html")

#         if request.method == "POST":
#             documentName = request.form.get("documentName","")
#             documentContent = request.form.get("documentContent","")

#             if documentName and documentContent:
#                 try:
#                     document_table = Documents(
#                         adminId=adminId,
#                         documentName = documentName,
#                         documentContent = documentContent,
#                         createdOn = datetime.datetime.now(),
#                         status = 1,
#                         )
#                     save_table = document_table.save()
#                     documentId = str(save_table.id)

#                     flash("Document created successfully!")
#                     return redirect(url_for("documents.get_documents_list",redirectTo="document"))
#                 except Exception as e:
#                     flash("Unable to create document details!!")
#                     app.logger.error(traceback.format_exc())
#                     return redirect(url_for("documents.get_documents_list",redirectTo="document"))
#             else:
#                 flash("Required fields are missing!!")
#                 return redirect(url_for("documents.get_documents_list",redirectTo="document"))
#         # else:
#             # flash("Staff member does not have given create bank permissions!!")
#             # return redirect(url_for("documents.get_documents_list",redirectTo="document"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to create document details!!"
#         return render_template("super_admin_templates/documents_list.html",error=error,redirectTo="document")


@documents.route("/edit_document",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def edit_document():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("session expired.Please login again.")
        data_status["responseStatus"]=4
        return data_status
    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()
    form = documentListForm()
    try:
        permissionsList = check_permissions(session.get("adminId"),"documentsPermissions")
        if "add" in permissionsList:
            documentId = request.args.get("documentId","")
            document_dict = {}
            if request.method == "GET":
                document_queryset = Documents.objects(status=1).order_by("-id").first()
                if document_queryset:
                    document_dict = fetching_document_details(document_queryset)
                return render_template("super_admin_templates/update_document.html",document_dict = document_dict,form=form)

            if request.method == "POST":
                documentName = request.form.get("documentName","")
                documentContent = request.form.get("documentContent","")
                print("((((((((((((((((((((((((((((((((((((request from))))))))))))))))))))))))))))))))))))",request.form)
                
                
                if form.validate_on_submit():

                    if documentContent and not is_valid_description(documentContent):
                        flash("Document Content can contain all characters")
                        return redirect(url_for("documents.get_documents_list"))
                    
                    jsonData = request.form.to_dict(flat=True)
                    requestData = [jsonData]
                    updatedrequestData = [jsonData]

                    if documentName and documentContent:
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+documentName+"Document created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"edit_document","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                                print("((((((((((((save_admin_log_table))))))))))))",save_admin_log_table)
                        
                                document_queryset = Documents.objects(status=1).order_by("-id").first()
                                if document_queryset:
                                    document_table = Documents(
                                        adminId=adminId,
                                        documentName = documentName,
                                        documentContent = documentContent,
                                        createdOn = datetime.datetime.now(),
                                        status = 1,
                                        )
                                    save_table = document_table.save()
                                else:
                                    document_table = Documents(
                                        adminId=adminId,
                                        documentName = documentName,
                                        documentContent = documentContent,
                                        createdOn = datetime.datetime.now(),
                                        status = 1,
                                        )
                                    save_table = document_table.save()
                                flash("Document created successfully!","success")
                                data_status['responseStatus']=1
                                return data_status
                        
                            else:
                                flash("Invalid request", "danger")
                                data_status["responseStatus"]=4
                                return data_status
                        except Exception as e:
                            flash("Unable to save the Document.", "danger")
                            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
                    print("(((((((((((((((((((((((((((fromerrors)))))))))))))))))))))))))))",form.errors)
                    return data_status        
            else:
                flash("Invalid request. Please try again.", "danger")
                data_status["responseStatus"]=4
                return data_status
        else:
            flash("The staff member does not have permission to create a Document.", "danger")
            return redirect(url_for("documents.get_documents_list",redirectTo="document"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update document details!!"
        flash(error)
    return redirect(url_for("documents.get_documents_list",redirectTo="document"))


@documents.route("/get_documents_list",methods=["POST","GET"])
@adminid_access_token_required
def get_documents_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    documentsList = []
    pagination = None
    adminId = session.get("adminId")
    search_element=""
    snoCount=0
    servicePage=None
    form = documentFormSearch(request.args)
    permissionsList = check_permissions(session.get("adminId"),"documentsPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","document")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "document"
                
           
            search_element = request.args.get("search_element","")

            servicePage = request.args.get(get_page_parameter("servicePage"), type=int, default=1)
            
            per_page = 20
            start = (servicePage - 1) * per_page
            total_count=0
            filters = Q(status__in=[0, 1])
            print(per_page,"((((((((((((((per_page))))))))))))))")
            if form.validate():
                if search_element:
                    filters &= Q(documentName__icontains=search_element)
                total_count = Documents.objects(filters).count()
            
                documents_queryset = (
                    Documents.objects(filters)
                    .only("id", "adminId", "documentName", "documentContent","createdOn","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                documentsList=list(documents_queryset)
                print("((((((((((((((((((((((((((((((((repoets))))))))))))))))))))))))))))))))",adminId)
            else:
                documentsList=[]
                
                
            snoCount = start
            
            # documents_queryset = Documents.objects(status__in=[0,1]).order_by("-id")
            # if search_element:
            #     documents_queryset = documents_queryset.filter(Q(documentName__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 = documents_queryset.count()

            # start = (page - 1) * per_page

            # end = min(start + per_page, total_count)

            # total_documents = documents_queryset[start:end]
            
            # snoCount = start
            # for each_document in total_documents:
            #     snoCount +=1
            #     document_dict = fetching_document_details(each_document)
            #     document_dict["snoCount"]=snoCount
            #     documentsList.append(document_dict)

            # Pagination object for rendering pagination controls in the template
            pagination = Pagination(servicePage=servicePage, total=total_count, per_page=per_page,page_parameter ="servicePage", alignment="right", record_name="documents",href=f"?search_element={search_element}&servicePage={{0}}")

            return render_template("super_admin_templates/documents_list.html",
                pagination=pagination,
                documentsList=documentsList,
                redirectval=redirectval,
                search_element=search_element,
                snoCount=snoCount,
                servicePage = servicePage,
                form=form
                )
        except Exception as e:
            app.logger.error(traceback.format_exc())
            error = "Unable to fetch documents details!!"
            return render_template("super_admin_templates/documents_list.html", 
                error=error,
                pagination=pagination,
                documentsList=documentsList,
                search_element=search_element,
                snoCount=snoCount,
                servicePage = servicePage,
                form=form
                )
    else:
        flash("The staff member does not have permission to view Documents", "danger")
        return redirect(url_for("admin.dashboard"))
        # return render_template("super_admin_templates/documents_list.html")

@documents.route("/document_status",methods=["POST","GET"])
@adminid_access_token_required
def document_status():
    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]
    servicePage = request.args.get("servicePage")
    search_element = request.args.get("search_element", "")
    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"),"documentsPermissions")
    if "edit" in permissionsList:
        documentId = request.args.get("documentId","")

        if documentId:
            try:
                message=""
                documents_queryset = Documents.objects(id=documentId).first()
                if documents_queryset:
                    existing_record = documents_queryset.to_json()
                    requestData = [existing_record]
                    if documents_queryset.status == 0:
                        documents_queryset.update(status=1)
                        flash("Document activated successfully!","success")
                        message=documents_queryset.adminId.userName+" "+documents_queryset.documentName+" Document activated successfully!"
                    elif documents_queryset.status == 1:
                        documents_queryset.update(status=0)
                        flash("Document deactivated successfully!","success")
                        message=documents_queryset.adminId.userName+" "+documents_queryset.documentName+" Document deactivated successfully!"
                    save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_bank_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                    print("(((((((((((save_admin_log_table)))))))))))",save_admin_log_table)
                    return redirect(url_for("documents.get_documents_list",redirectTo="document",servicePage=servicePage,search_element=search_element))
                else:
                    flash("Invaild id!!")
                    return redirect(url_for("documents.get_documents_list",redirectTo="document",servicePage=servicePage,search_element=search_element))
            except Exception as e:
                app.logger.error(traceback.format_exc())
                return redirect(url_for("documents.get_documents_list",redirectTo="document",servicePage=servicePage,search_element=search_element))
        else:
            flash("Required field is missing!!")
            return redirect(url_for("documents.get_documents_list",redirectTo="document",servicePage=servicePage,search_element=search_element))
    else:
        flash("Staff member does not have given status update document permissions!!")
        flash("The staff member does not have permission to update Document status.", "danger")
        return redirect(url_for("documents.get_documents_list",redirectTo="document",servicePage=servicePage,search_element=search_element))