import { AutoRoute as AutoRouteInitializer, Route, Methods } from "./AutoRoute";
import AutoRoutePluginCallback from "./AutoRoutePluginCallback";
import * as joi from "@hapi/joi";
import RouteRequestJsonSchemaValidator from "./middleware/routeRequestJsonSchemaValidatorMiddleware";
import RouteResponseJsonSchemaValidator from "./middleware/routeResponseJsonSchemaValidatorMiddleware";

export interface Config {
    routeBasePath: string;
    server: any;
    routes: Route[];
    middlewares?: any[];
}

const AutoRoute = async (config: Config): Promise<string[]> => {
    joi.assert(
        config,
        joi.object().keys({
            server: joi.any().required(),
            routeBasePath: joi.string(),
            routes: joi.any().required(),
            middlewares: joi.array(),
        }).required(),
    );
    const {server, routes, middlewares, routeBasePath} = config;
    const autoRoutePluginCallback = new AutoRoutePluginCallback(middlewares);
    const autoRoute = new AutoRouteInitializer(server, autoRoutePluginCallback, {routeBasePath});

    return await autoRoute.mount(routes);
};

// Backward compatibility
const autoRoute = AutoRoute;

export {
    RouteRequestJsonSchemaValidator,
    RouteResponseJsonSchemaValidator,
    Route,
    Methods,
    AutoRoute,
    autoRoute
};

export default AutoRoute;
