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

business_documents = Blueprint("business_documents",__name__)


@business_documents.route("/add_business_documents",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_business_documents():
    data_status={"responseStatus":0,"result":""}
    try:
        if not session.get("adminId"):
            flash("Session expired Please login again.","danger")
            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()
        
        permissionsList = check_permissions(adminId,"businessDocumentsPermissions")
        if "add" in permissionsList:
            if request.method == "POST":
                
                name = request.form.get("name","")
                isRequired = request.form.get("isRequired", "off")

                jsonData = request.form.to_dict(flat=True)
                requestData = [jsonData]
                updatedrequestData = [jsonData]  
                
                isRequired = True if isRequired == "True" else False
                form = BusinessDocumentForm()
                if form.validate_on_submit():
                    if name :
                        # if not is_valid_alphanumeric(name):
                        #     flash("Document must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                        #     return redirect(url_for("business_documents.business_documents_list"))
                        
                        try:
                            admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
                            if admin_queryset:
                                message=admin_queryset.userName+" "+name+" Business Document created successfully!"
                                save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_business_documents","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
                            business_documents_table = BusinessDocuments(
                                adminId=adminId,
                                name = name,
                                status = 1,
                                createdOn = datetime.datetime.now(),
                                isRequired=isRequired,
                                )
                            save_table = business_documents_table.save()
                            businessDocumentId = str(save_table.id)
                            
                            flash("Business Document saved successfully","success")
                            data_status['responseStatus']=1
                            return data_status
                        except Exception as e:
                            flash("Unable to save Business type","danger")
                            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
                    return data_status
            else:
                flash("Invalid request.","danger")
                data_status['responseStatus']=4
                return data_status  
        else:
            flash("The staff member does not have permission to create a Buiness document.", "danger")
            data_status['responseStatus']=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save Business Document!!"
        flash("Unable to save Business Document", "danger")
        data_status['responseStatus']=4
        return data_status



@business_documents.route("/update_business_document", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def update_business_document():
    data_status={"responseStatus":0,"result":""}
    if not session.get("adminId"):
        flash("Session expired Please login again.","danger")
        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]

    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()
    businessDocumentId = request.args.get("businessDocumentId","")
    
    try:
        permissionsList = check_permissions(session.get("adminId"),"businessDocumentsPermissions")
        if "edit" in permissionsList:               
            # businessDocumentId = request.args.get("businessDocumentId","")
            if request.method == "POST":
                form = BusinessDocumentForm(request.form, current_id=businessDocumentId)
                if form.validate_on_submit():
                    name = request.form.get("name", "")
                    isRequired = request.form.get("isRequired", "off")
                    jsonData = request.form.to_dict(flat=True) 
                    remark = request.form.get("remark","") 
                    
                    
                    # isRequired = True if isRequired == "True" else False

                    if name:
                        # if not is_valid_alphanumeric(name):
                        #     flash("Document must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
                        #     return redirect(url_for("business_documents.business_documents_list"))
                        print("(((((((((((((((((((((((name)))))))))))))))))))))))",name)
                        business_document_queryset = BusinessDocuments.objects(id=businessDocumentId, status__in=[0, 1]).first()
                        existing_record = business_document_queryset.to_json()
                        message=business_document_queryset.adminId.userName+" "+name+" Business Document updated successfully!"
                        requestData=[existing_record]
                        updatedrequestData=[jsonData]
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_business_document","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                        save_remarks_data=save_admin_remarks_data(businessDocumentId,adminId,remark,"businessDocuments") 
                        if isRequired == "True":
                            isRequired = True
                        else:
                            isRequired = False 
                        if business_document_queryset:
                            business_document_queryset.update(name=name,isRequired=isRequired)
                            flash("Business Document updated successfully","success")
                            data_status["responseStatus"]=1
                            return data_status
                        else:
                            flash("Invalid ID","danger")
                            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
                    return data_status    
            else:                     
                flash("Invalid request", "danger")
                data_status["responseStatus"]=4
                return data_status
        else:
            flash("The staff member does not have permission to update Business Document.", "danger")
            data_status["responseStatus"]=4
            return data_status
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to update Business Document details!")
        data_status["responseStatus"]=4
        return data_status

        
# @business_documents.route("/business_documents_list", methods=["GET"])
# def business_documents_list():
#     try:
#         if not session.get("adminId"):
#             return redirect("admin_login")
        
#         documents = BusinessDocuments.objects(status=1) 
#         return render_template("super_admin_templates/business_documents_list.html", documents=documents)
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to retrieve Business Documents!"
#         return render_template("super_admin_templates/business_documents_list.html", error=error)




@business_documents.route("/business_documents_list",methods=["POST","GET"])
@adminid_access_token_required
def business_documents_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    businessDocumentsList = []
    pagination = None
    adminId = session.get("adminId")
    search_element=""
    snoCount=0
    servicePage=None
    form=''
    permissionsList = check_permissions(session.get("adminId"),"businessDocumentsPermissions")
    if "view" in permissionsList:
        try:
            redirectTo = request.args.get("redirectTo","BusinessDocument")
            if redirectTo:
                redirectval = redirectTo
            else:
                redirectval = "BusinessDocument"
            form = BusinessFormSearch(request.args)
            search_element = request.args.get("search_element", "").strip()
            servicePage = request.args.get(get_page_parameter("servicePage"), type=int, default=1)
            print(servicePage,"((((((((((servicePage))))))))))")
            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(name__icontains=search_element)
                total_count = BusinessDocuments.objects(filters).count()

                business_documents_queryset = (
                    BusinessDocuments.objects(filters)
                    .only("id", "name","isRequired","status")
                    .order_by("-id")
                    .skip(start)
                    .limit(per_page)
                )
                businessDocumentsList=list(business_documents_queryset)
            else:
                businessDocumentsList=[]
                
            snoCount = start
            # business_documents_queryset = BusinessDocuments.objects(status__in=[0,1]).order_by("-id")
            # if search_element:
            #     business_documents_queryset = business_documents_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 = business_documents_queryset.count()

            # start = (page - 1) * per_page

            # end = min(start + per_page, total_count)

            # total_business_documents = business_documents_queryset[start:end]
            
            # snoCount = start
            # for each_business_documents in total_business_documents:
            #     snoCount +=1
            #     business_document_dict = fetching_business_document_details(each_business_documents)
            #     business_document_dict["snoCount"]=snoCount
            #     businessDocumentsList.append(business_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="business",href=f"?search_element={search_element}&servicePage={{0}}")

            return render_template("super_admin_templates/business_documents_list.html",
                pagination=pagination,
                businessDocumentsList=businessDocumentsList,
                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 business document details!!"
            return render_template("super_admin_templates/business_documents_list.html", 
                error=error,
                pagination=pagination,
                businessDocumentsList=businessDocumentsList,
                search_element=search_element,
                snoCount=snoCount,
                servicePage = servicePage,
                form=form,
                )
    else:
        flash("The staff member does not have permission to view Business documents", "danger")
        return redirect(url_for("admin.dashboard"))



# @business_documents.route("/delete_business_document", methods=["POST"])
# def delete_business_document(businessDocumentId):
#     if not session.get("adminId"):
#         return redirect("admin_login")
#     businessDocumentId = request.args.get("businessDocumentId","")
    
#     try:
#         business_document_queryset = BusinessDocuments.objects(id=businessDocumentId).first()
#         if business_document_queryset:
#             business_document_queryset.update(set__status=0)  # Soft delete by updating status
#             flash("Business Document deleted successfully!")
#         else:
#             flash("Invalid ID!")
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Unable to delete Business Document!")
#     return redirect(url_for("business_documents.business_documents_list"))

@business_documents.route("/delete_business_document",methods=["GET"])
@adminid_access_token_required
def delete_business_document():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId=session.get("adminId")
        
        servicePage=request.args.get("servicePage")
        search_element=request.args.get("search_element")
        latitude = request.args.get("latitude", "")
        longitude = request.args.get("longitude", "")
        redirectTo=url_for("business_documents.business_documents_list",servicePage=servicePage,search_element=search_element)
        
        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]
        remark = request.form.get("remark","")
        permissionsList = check_permissions(session.get("adminId"),"businessDocumentsPermissions")
        if "delete" in permissionsList:
            if request.method == "GET":
                businessDocumentId = request.args.get("businessDocumentId","")
                business_document_queryset = BusinessDocuments.objects(id=businessDocumentId,status__in=[0,1]).first()
                existing_record = business_document_queryset.to_json()
                requestData = [existing_record]
                business_document_queryset.update(status=2)
                flash("Business Document deleted successfully","success")
                message=business_document_queryset.adminId.userName+" "+business_document_queryset.name+" User deleted successfully!"
                save_remarks_data=save_admin_remarks_data(businessDocumentId,adminId,remark,"businessDocuments")
                save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_business_document","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
        else:
            flash("The staff member does not have permission to delete Business Document.", "danger")
            return redirect(url_for("business_documents.business_documents_list",servicePage=servicePage,search_element=search_element))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete Business Document","danger")
        return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))




# @business_documents.route("/update_business_document_status",methods=["POST","GET"])
# @adminid_access_token_required
# @csrf_protect
# def update_business_document_status():
#     data_status={"responseStatus":0,"result":""}
#     if not session.get("adminId"):
#         data_status["responseStatus"]=4
#         return data_status
#     adminId=session.get("adminId")
    
#     csrf_token = request.form.get("csrf_token")
#     print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
#     servicePage = request.args.get("servicePage")
#     search_element = request.args.get("search_element", "")
#     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]
#     form=UpdateStatusRemarkForm()
#     if form.validate_on_submit():
#         permissionsList = check_permissions(session.get("adminId"),"businessDocumentsPermissions")
#         if "edit" in permissionsList:
#             businessDocumentId = request.args.get("businessDocumentId","")
#             remark = request.form.get("remark","")

#             if businessDocumentId and remark:
#                 try:
#                     message=""
#                     business_document_queryset = BusinessDocuments.objects(id=businessDocumentId,status__nin=[2]).first()
#                     existing_record = business_document_queryset.to_json()
#                     requestData = [existing_record]
#                     if business_document_queryset:
#                         if business_document_queryset.status == 0:
#                             business_document_queryset.update(status=1)
#                             flash("Business Document activated successfully!","success")
#                             message=business_document_queryset.adminId.userName+" "+business_document_queryset.name+" Business Document activated successfully!"
#                         elif business_document_queryset.status == 1:
#                             business_document_queryset.update(status=0)
#                             flash("Business Document deactivated successfully!","success")
#                             message=business_document_queryset.adminId.userName+" "+business_document_queryset.name+" Business Document deactivated successfully!"
#                         save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_business_document_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
#                         save_remarks_data=save_admin_remarks_data(businessDocumentId,adminId,remark,"businessDocuments")
#                         data_status["responseStatus"]=1
#                         return data_status
#                     else:
#                         flash("Invalid ID.", "danger")
#                         data_status["responseStatus"]=4
#                         return data_status
#                 except Exception as e:
#                     flash("Unable to update status.", "danger")
#                     app.logger.error(traceback.format_exc())
#                     data_status["responseStatus"]=4
#                     return data_status
#             else:
#                 flash("Required field is missing!!","danger")
#                 data_status["responseStatus"]=2
#                 return data_status
#         else:
#             flash("The staff member does not have permission to update the status of this Document", "danger")
#             data_status["responseStatus"]=4
#             return data_status
#     else:
#         data_status["responseStatus"]=0
#         data_status["result"]=form.errors
#         return data_status









@business_documents.route("/update_business_document_status",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_business_document_status():
    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))))))))))))))")
    servicePage = request.args.get("servicePage")
    search_element = request.args.get("search_element", "")
    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()

    jsonData = request.form.to_dict(flat=True)

    existing_record = ""
    updatedrequestData = [jsonData]
    form=UpdateStatusRemarkForm()
    
    permissionsList = check_permissions(session.get("adminId"),"businessDocumentsPermissions")
    if "edit" in permissionsList:
        businessDocumentId = request.args.get("businessDocumentId","")
        remark = request.form.get("remark","")
        if form.validate_on_submit():
            if businessDocumentId and remark:
                try:
                    message=""
                    business_document_queryset = BusinessDocuments.objects(id=businessDocumentId,status__nin=[2]).first()
                    existing_record = business_document_queryset.to_json()
                    requestData = [existing_record]
                    if business_document_queryset:
                        if business_document_queryset.status == 0:
                            business_document_queryset.update(status=1)
                            flash("Business Document activated successfully!","success")
                            message=business_document_queryset.adminId.userName+" "+business_document_queryset.name+" Business Document activated successfully!"
                        elif business_document_queryset.status == 1:
                            business_document_queryset.update(status=0)
                            flash("Business Document deactivated successfully!","success")
                            message=business_document_queryset.adminId.userName+" "+business_document_queryset.name+" Business Document deactivated successfully!"
                        save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_business_document_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
                        save_remarks_data=save_admin_remarks_data(businessDocumentId,adminId,remark,"businessDocuments")
                        data_status['responseStatus']=1
                        return data_status
                        # return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
                    else:
                        flash("Invaild Id!","danger")
                        data_status['responseStatus']=4
                        return data_status
                        # return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
                except Exception as e:
                    flash("Unable to update the status", "danger")
                    app.logger.error(traceback.format_exc())
                    data_status['responseStatus']=4
                    return data_status
                    # return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
            else:
                data_status['responseStatus']=2
                data_status['result']="Required fields are missing!!"
                return data_status
                # flash("Required field is missing!!","danger")
                # return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
        else:
            data_status['result']=form.errors
            return data_status
            # return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
    else:
        flash("The staff member does not have permission to update Business Document status.", "danger")
        data_status['responseStatus']=4
        return data_status
        # return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
    # else:
    #     flash(list(form.errors.values())[0][0], "danger")
    #     return redirect(url_for("business_documents.business_documents_list",redirectTo="BusinessDocument",servicePage=servicePage,search_element=search_element))
