import Hapi from '@hapi/hapi'
import fs from 'fs/promises'
import path from 'path'
import { I18N } from '../utils/i18n';

const lang = process.env.DEFAULT_LANGUAGE_CODE || "en";

const translateModelDescription = (schema: any) => {
    if (schema._flags && schema._flags.description) {
        const descKey = schema._flags.description;
        if (descKey && typeof schema.description === "function") {
            schema = schema.description(I18N.t(descKey, { language: lang }));
        }
    }
    return schema;
}

const addTranslatedModelDescriptions = (route: any) => {
    if (route.options?.validate) {
        Object.keys(route.options.validate).forEach((key) => {
            route.options.validate[key] = translateModelDescription(route.options.validate[key]);
        });
    }
    if (route.options?.response?.status) {
        Object.keys(route.options.response.status).forEach((statusCode) => {
            route.options.response.status[statusCode] =
                translateModelDescription(route.options.response.status[statusCode]);
        });
    }
    return route;
}

export const registerApiRoutes = async (server: Hapi.Server, prefix: string) => {
    const plugin: Hapi.Plugin<{}> = {
        name: 'api-routes',
        register: async (srv: Hapi.Server) => {
            const routesDir = path.join(__dirname, '../api/routes')
            const files = await fs.readdir(routesDir)
            for (const file of files) {
                if (file.endsWith('.ts') || file.endsWith('.js')) {
                    const routeModule = await import(path.join(routesDir, file))
                    if (Array.isArray(routeModule.default)) {
                        const translatedRoutes = routeModule.default.map(addTranslatedModelDescriptions);
                        // srv.route(routeModule.default)
                        srv.route(translatedRoutes);
                    }
                }
            }
        },
    }
    let routes: any = {};
    if (prefix) {
        routes['prefix'] = prefix
    }
    await server.register({
        plugin: plugin,
        options: {},
        routes: routes,
    } as Hapi.ServerRegisterPluginObject<{}>)
}
