import { createApp, registerRoutes, createRouter } from '@thalorlabs/express-core';
import { createServer } from '@thalorlabs/express-core';
import { createLambdaHandler } from '@thalorlabs/express-core';
import {
  requestIdMiddleware,
  globalErrorHandler,
  jsonErrorHandler,
  notFoundHandler,
  contentTypeValidationMiddleware,
  emptyBodyValidationMiddleware,
} from '@thalorlabs/middleware';

import { {{NAME_CAMEL}}Router } from './feature/{{NAME}}/router';
import { ENV, IS_DEBUG } from './config/constants';

const app = createApp({
  middleware: [
    requestIdMiddleware,
    contentTypeValidationMiddleware,
    emptyBodyValidationMiddleware,
  ],
  errorHandlers: [
    jsonErrorHandler({ showDebug: IS_DEBUG }),
    globalErrorHandler({ showDebug: IS_DEBUG }),
  ],
  notFoundHandler,
  swagger: {
    title: 'tl-{{NAME}}-ms',
    version: '1.0.0',
    description: '{{NAME_PASCAL}} orchestrator API',
  },
});

const v1Router = createRouter(
  [{ path: '/v1/{{NAME}}', router: {{NAME_CAMEL}}Router }],
  { serviceName: 'tl-{{NAME}}-ms', version: '1.0.0' }
);

registerRoutes(app, [v1Router]);

export { app };
export const handler = createLambdaHandler(app);

const PORT = parseInt(ENV.PORT ?? '3001', 10);
if (ENV.ENVIRONMENT !== 'PRODUCTION' && process.env.VITEST !== 'true') {
  createServer(app, {
    port: PORT,
    onStart: (port: number) => {
      console.log(`tl-{{NAME}}-ms running on port ${port}`);
    },
  });
}
