import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { App, LogLevel } from '@slack/bolt';
import { AppModule } from './app.module';
import { EEnvVariable } from './configuration/enums/env-variable.enum';
import { ConfiguredIoAdapter } from './configured-io-adapter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useWebSocketAdapter(new ConfiguredIoAdapter(app.getHttpServer()));
  app.useGlobalPipes(new ValidationPipe());
  app.setGlobalPrefix(process.env[EEnvVariable.URL_PREFIX]);
  app.enableShutdownHooks();

  (global as any).slackBoltApp = new App({
    token: process.env[EEnvVariable.SLACK_BOT_TOKEN],
    signingSecret: process.env[EEnvVariable.SLACK_SIGNING_SECRET],
    logLevel: LogLevel.DEBUG,
    endpoints: '/',
  });

  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  // @ts-ignore `receiver` property is private but we still need to access it
  app.use(
    `${process.env[EEnvVariable.SLACK_BOLT_PATH_SUBDIRECTORY]}/slack/events`,
    (global as any).slackBoltApp.receiver.requestListener
  );
  await app.listen(process.env[EEnvVariable.API_PORT]);
}
bootstrap();
