import { HttpAdapterHost, NestFactory, Reflector } from '@nestjs/core';
import { AppModule } from './app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common';
import { PrismaClientExceptionFilter } from 'nestjs-prisma';
import { WinstonModule } from 'nest-winston';
import { logger } from './logger/winston.logger';
import { json, urlencoded } from 'express';

async function bootstrap() {
	const instance = logger;

	const app = await NestFactory.create(AppModule, {
		logger: WinstonModule.createLogger({
			instance,
		}),
	});
	const { httpAdapter } = app.get(HttpAdapterHost);

	app.setGlobalPrefix('api/v1');
	app.enableCors({
		origin: ['https://bravo.mediaengine-dev6.com.au', 'http://localhost:3000'],
		methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
	});
	app.useGlobalFilters(new PrismaClientExceptionFilter(httpAdapter));
	app.use(json({ limit: '50mb' }));
	app.use(urlencoded({ extended: true, limit: '50mb' }));
	app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
	app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));

	const config = new DocumentBuilder().setTitle('Echo').setDescription('Database API for Bravo').setVersion('0.1.1').addBearerAuth().build();

	const document = SwaggerModule.createDocument(app, config);
	SwaggerModule.setup('docs', app, document);

	await app.listen(3001);
}
bootstrap();
