import os
import sys
from flask import Flask
from src.errors.argument_exception import argument_exception
from src.export.exporter_factory import exporter_factory

from src.settings.settings_manager import settings_manager
from src.logic.start_factory import start_factory
from src.storage.storage import storage


setman = settings_manager()
start = None
strg = None

app = Flask(__name__)


@app.route("/api/export/<storage_key>/<format>", methods=["GET"])
def get_export_format(storage_key: str, format: str):
    global setman, start, strg

    try:
        exp = exporter_factory().create(format)
    except argument_exception as e:
        return "Wrong format: " + e.error.error_text, 400

    if storage_key not in strg.data:
        return "Key not found", 404

    return app.response_class(
        response=exp.export_by_key(storage_key),
        status=200,
        mimetype=exp.strategy.mimetype,
    )


@app.route("/api/export/<storage_key>", methods=["GET"])
def get_export(storage_key: str):
    global setman, start, strg
    format = setman.settings.export_format
    try:
        exp = exporter_factory().create(format)
    except argument_exception as e:
        return "Wrong format: " + e.error.error_text, 400

    if storage_key not in strg.data:
        return "Key not found", 404

    return app.response_class(
        response=exp.export_by_key(storage_key),
        status=200,
        mimetype=exp.strategy.mimetype,
    )


# Инициализация приложения
def run():
    global setman, start, strg
    setman.open(os.path.dirname(__file__) + "/config/settings.json")
    strg = storage()
    start = start_factory(setman.settings, strg)
    start.create()
    start.create_transactions()
    app.run()


if __name__ == "__main__":
    run()