import sys
import traceback

from main import APIWrapper
from flask import request
from utilities.schema_loader import SchemaLoad
from logger_module.package_logger import print_log


class Routes:
    schema_path = 'api_wrapper/api/routes.json'

    def main(self, app, app_name):
        endpoint_dict = self.get_routes_schema(app_name)
        for endpoint, details in endpoint_dict.items():
            for k, v in details.items():
                if k == 'method':
                    method = v
                    endpoint_function = self.generate_route()
                    route_name = endpoint.replace('/', '_').replace('-', '_').replace('.', '_').replace('/', '_').replace(':', '_').replace('<', '_').replace('>', '_')
                    app.route(endpoint, endpoint=route_name, methods=[method.upper()])(endpoint_function)

    @classmethod
    def generate_route(cls):
        def dynamic_route():
            try:
                response = APIWrapper(request).main()
                return response
            except Exception as ex:
                traceback.print_exc()
                return ex
        return dynamic_route

    def get_routes_schema(self, app_name):
        schema_loader = SchemaLoad()
        schema = schema_loader.read_schema(self.schema_path)
        endpoint_dict = {key: value for name in app_name if name in schema for key, value in schema[name].items()}
        # endpoint_dict = schema.get(app_name)
        return endpoint_dict
