from flask import Flask
from flask import Response
from flask import request
from staffeln import objects
from staffeln.common import context
from staffeln.common import openstack
from oslo_log import log


ctx = context.make_context()
app = Flask(__name__)

LOG = log.getLogger(__name__)


@app.route("/v1/backup", methods=["POST"])
def backup_id():
    openstacksdk = openstack.OpenstackSDK()
    retention_user_id = openstacksdk.get_user_id()
    
    if not "user_id" in request.args or not "backup_id" in request.args:
        # Return error if the backup_id argument is not provided.
        return Response(
            "Error: backup_id or user_id is missing.", status=403, mimetype="text/plain"
        )

    if retention_user_id == request.args["user_id"]:
        return Response("True", status=200, mimetype="text/plain")

    # Retrive the backup object from backup_data table with matching backup_id.
    backup = objects.Volume.get_backup_by_backup_id(ctx, request.args["backup_id"])
    # backup_info is None when there is no entry of the backup id in backup_table.
    # So the backup should not be the automated backup.
    if backup is None:
        return Response(
            "True",
            status=200,
            mimetype="text/plain",
        )
    else:
        return Response("False", status=401, mimetype="text/plain")


def run(host, port, ssl_context):
    app.run(host=host, port=port, ssl_context=ssl_context)
