from flask import Flask, Response, request
from oslo_log import log
from staffeln import objects
from staffeln.common import context

ctx = context.make_context()
app = Flask(__name__)

LOG = log.getLogger(__name__)


@app.route("/v1/backup", methods=["POST"])
def backup_id():

    if "backup_id" not in request.args:
        # Return error if the backup_id argument is not provided.
        return Response(
            "Error: backup_id is missing.", status=403, mimetype="text/plain"
        )

    # Retrive the backup object from backup_data table with matching backup_id.
    backup = objects.Volume.get_backup_by_backup_id(
        context=ctx, backup_id=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)
