from flask import Response
from flask_restful import Resource, reqparse
from werkzeug.exceptions import Forbidden, NotFound

from controllers.files import api
from core.tools.tool_file_manager import ToolFileManager
from libs.exception import BaseHTTPException


class ToolFilePreviewApi(Resource):
    def get(self, file_id, extension):
        file_id = str(file_id)

        parser = reqparse.RequestParser()

        parser.add_argument("timestamp", type=str, required=True, location="args")
        parser.add_argument("nonce", type=str, required=True, location="args")
        parser.add_argument("sign", type=str, required=True, location="args")

        args = parser.parse_args()

        if not ToolFileManager.verify_file(
            file_id=file_id,
            timestamp=args["timestamp"],
            nonce=args["nonce"],
            sign=args["sign"],
        ):
            raise Forbidden("Invalid request.")

        try:
            result = ToolFileManager.get_file_generator_by_tool_file_id(
                file_id,
            )

            if not result:
                raise NotFound("file is not found")

            generator, mimetype = result
        except Exception:
            raise UnsupportedFileTypeError()

        return Response(generator, mimetype=mimetype)


api.add_resource(ToolFilePreviewApi, "/files/tools/<uuid:file_id>.<string:extension>")


class UnsupportedFileTypeError(BaseHTTPException):
    error_code = "unsupported_file_type"
    description = "File type not allowed."
    code = 415