from appservices.common.util import *

tenant_managements = Blueprint("tenant_managements",__name__)

@tenant_managements.route("/add_tenant",methods=["POST","GET"])
def add_tenant():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        adminId = session.get("adminId")
        if request.method == "POST":
            name = request.form.get("name","")
            domainName = request.form.get("domainName","")
            version = request.form.get("version","")
            if name and domainName and version:
                try:
                    tenant_table = TenantManagements(
                        adminId=adminId,
                        name = name,
                        domainName = domainName,
                        version = version,
                        createdOn = datetime.datetime.now(),
                        status = 1,
                        )
                    save_table = tenant_table.save()

                    flash("Tenant saved successfully!")
                    return redirect(url_for("tenant_managements.tenant_managements_list"))
                except Exception as e:
                    flash("Unable to save tenant!!")
                    app.logger.error(traceback.format_exc())
                    return redirect(url_for("tenant_managements.tenant_managements_list"))
            else:
                flash("Required fields are missing!!")
                return redirect(url_for("tenant_managements.tenant_managements_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to save tenant!!"
        return render_template("super_admin_templates/tenant_managements_list.html",error=error)

@tenant_managements.route("/tenant_managements_list",methods=["POST","GET"])
def tenant_managements_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    tenantslList = []
    
    adminId = session.get("adminId")
    try:
        tenant_search_element = request.form.get("tenant_search_element","")
        
        tenants_queryset = TenantManagements.objects(status__in=[0,1]).order_by("-id")
        if tenant_search_element:
            tenants_queryset = tenants_queryset.filter(Q(name__icontains=tenant_search_element))

        for each_tenant in tenants_queryset:
            tenantDict = fetching_tenant_details(each_tenant)
            tenantslList.append(tenantDict)

        return render_template("super_admin_templates/tenant_managements_list.html",
            tenantslList=tenantslList,
            tenant_search_element=tenant_search_element
            )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to fetch system configurations details!!"
        return render_template("super_admin_templates/tenant_managements_list.html", 
            error=error,
            tenantslList=tenantslList,
            tenant_search_element=tenant_search_element
            )


@tenant_managements.route("/update_tenant_status",methods=["POST","GET"])
def update_tenant_status():
    if not session.get("adminId"):
        return redirect("admin_login")
    tenantId = request.args.get("tenantId","")

    if tenantId:
        try:
            tenant_queryset = TenantManagements.objects(id=tenantId,status__nin=[2]).first()
            if tenant_queryset:
                if tenant_queryset.status == 0:
                    tenant_queryset.update(status=1)
                    flash("Tenant activated successfully!")
                elif tenant_queryset.status == 1:
                    tenant_queryset.update(status=0)
                    flash("Tenant deactivated successfully!")
                return redirect(url_for("tenant_managements.tenant_managements_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("tenant_managements.tenant_managements_list"))
        except Exception as e:
            app.logger.error(traceback.format_exc())
            return redirect(url_for("tenant_managements.tenant_managements_list"))
    else:
        return redirect(url_for("tenant_managements.tenant_managements_list"))


@tenant_managements.route("/update_tenant",methods=["POST","GET"])
def update_tenant():
    if not session.get("adminId"):
        return redirect("admin_login")
    try:
        tenantId = request.args.get("tenantId","")
        if request.method == "POST":
            name = request.form.get("name","")
            domainName = request.form.get("domainName","")
            version = request.form.get("version","")

            tenant_queryset = TenantManagements.objects(id=tenantId).first()
            if tenant_queryset:
                tenant_queryset.update(
                    name=name,
                    domainName=domainName,
                    version=version
                    )
                flash("Tenant updated successfully!")
                return redirect(url_for("tenant_managements.tenant_managements_list"))
            else:
                flash("Invaild id!!")
                return redirect(url_for("tenant_managements.tenant_managements_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        error = "Unable to update tenant!!"
        return redirect(url_for("tenant_managements.tenant_managements_list"))


@tenant_managements.route("/delete_tenant",methods=["GET"])
def delete_tenant():
    try:
        if not session.get("adminId"):
            return redirect("admin_login")
        if request.method == "GET":
            tenantId = request.args.get("tenantId","")
            tenant_queryset = TenantManagements.objects(id=tenantId,status__in=[0,1]).first()
            tenant_queryset.update(status=2)
            flash("Tenant deleted successfully!")
            return redirect(url_for("tenant_managements.tenant_managements_list"))
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to delete tenant!!")
        return redirect(url_for("tenant_managements.tenant_managements_list"))


def fetching_csv_tenant_details(tenant_queryset):
    tenantDict = {}
    try:
        if tenant_queryset.name:
            tenantDict["Name"] = tenant_queryset.name
        else:
            tenantDict["Name"] = ""
    except Exception as e:
        app.logger.error(traceback.format_exc())
    return tenantDict


@tenant_managements.route("/tenants_csv_list",methods=["POST","GET"])
def tenants_csv_list():
    if not session.get("adminId"):
        return redirect("admin_login")
    tenantslList = []
    
    adminId = session.get("adminId")
    try:
        tenants_queryset = TenantManagements.objects(status__in=[0,1]).order_by("-id").all()

        for each_tenant in tenants_queryset:
            tenantDict = fetching_csv_tenant_details(each_tenant)
            tenantslList.append(tenantDict)

        fieldnames = ['Name']
        temp_csv_file_name = "/media/tenants_csv_files/"+str(round(time.time() * 1000))+".csv"

        if not os.path.exists(os.path.join(app.config['SITE_ROOT'], "media/tenants_csv_files/")):
            os.makedirs(os.path.join(app.config['SITE_ROOT'], "media/tenants_csv_files/"))

        full_file_name = app.config['SITE_ROOT']+temp_csv_file_name
        with open(full_file_name, 'w', encoding='UTF8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(tenantslList)
        save_csv_file = CSVFileExports(
            name=temp_csv_file_name,
            filters=[],
            createdOn=datetime.datetime.now(),
            status=1
            ).save()
        csvFileId = str(save_csv_file.id)

        return send_file(
            app.config['SITE_ROOT']+temp_csv_file_name,
            mimetype='text/csv',
            download_name='Tenants list.csv',
            as_attachment=True
        )
    except Exception as e:
        app.logger.error(traceback.format_exc())
        flash("Unable to export CSV data!!")
        return redirect("tenant_managements.tenant_managements_list")