import nc from "next-connect"
import middlewares from "./config/middlewares";
import {NextApiRequest} from "ngnjs/dist/types/NextApiRequest";
import {NextApiResponse} from "ngnjs/dist/types/NextApiResponse";
import Logger from "ngnjs/dist/services/logger/Logger";
import Keyable from "ngnjs/dist/types/Keyable";
import NGNError from "ngnjs/dist/errors/NGNError";
import {Middleware} from "ngnjs/dist/types/Middleware";

const errorHandler = (err: NGNError, req: NextApiRequest, res: NextApiResponse) => {
    const context: Keyable = {
        url: req.url,
        body: req.body,
        queryString: req.query,
        method: req.method,
    }
    Logger.getInstance().error(err.stack ?? err.message, context);
    const debug: boolean = process.env.APP_DEBUG === "true";
    const body = ((err.isPrivateMessage && !debug) ? {message: "server error"} : {message: err.message, ...err.context});
    res.status(err.status ?? 500).json(body);
    res.end();
}

const noMatchHandler = (req: NextApiRequest, res: NextApiResponse) => {
    return res.status(405).json({message: `method ${req.method} is not supported`})
}

const handler = () => {
    const instance = nc({onError: errorHandler, onNoMatch: noMatchHandler});
    for (let endpoint in middlewares){
        if(middlewares.hasOwnProperty(endpoint))
            middlewares[endpoint].forEach((item: Middleware) => {
                instance.use(`/api${endpoint}`, item);
            });
    }
    return instance;
}

export default handler;