import {
	ClassSerializerInterceptor,
	HttpStatus,
	ValidationPipe,
} from "@nestjs/common";
import { HttpAdapterHost, NestFactory, Reflector } from "@nestjs/core";
import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
import { PrismaClientExceptionFilter } from "nestjs-prisma";
import { AppModule } from "./app.module";

async function bootstrap() {
	const app = await NestFactory.create(AppModule);

	app.enableCors({
		origin: "*",
	});

	const { httpAdapter } = app.get(HttpAdapterHost);
	app.useGlobalFilters(
		new PrismaClientExceptionFilter(httpAdapter, {
			P2000: {
				errorMessage: "A required field is missing",
				statusCode: HttpStatus.BAD_REQUEST,
			},
			P2002: {
				errorMessage:
					"A ressource with the same unique fields already exists",
				statusCode: HttpStatus.CONFLICT,
			},
			P2025: {
				errorMessage: "The requested ressource does not exist",
				statusCode: HttpStatus.NOT_FOUND,
			},
		}),
	);

	app.useGlobalPipes(new ValidationPipe());

	app.useGlobalInterceptors(
		new ClassSerializerInterceptor(app.get(Reflector), {
			excludeExtraneousValues: true,
		}),
	);

	const config = new DocumentBuilder()
		.setTitle("Toogether API")
		.addBearerAuth()
		.build();
	const documentFactory = () => SwaggerModule.createDocument(app, config);
	SwaggerModule.setup("documentation", app, documentFactory, {
		swaggerOptions: {
			tryItOutEnabled: true,
			persistAuthorization: true,
		},
	});

	await app.listen(process.env.PORT ?? 3000, "0.0.0.0");
}
bootstrap();