import { NestFactory, Reflector } from '@nestjs/core';
import { AppModule } from './app.module';
import { ModulesGuard } from './common/guards/modules.guard';
import * as session from 'express-session';
import * as passport from 'passport';
import { PrismaSessionStore } from '@quixo3/prisma-session-store';
import { PrismaPostgresService } from 'prisma/postgres/prisma-postgres.service';

const SESSION_TOKEN_DURATION_MINUTES = 180

async function bootstrap() {
    BigInt.prototype['toJSON'] = function () { return Number(this) };
    const app = await NestFactory.create(AppModule);
    const prisma_postgres = app.get(PrismaPostgresService);

    const reflector = app.get(Reflector);

    app.useGlobalGuards(
        new ModulesGuard(reflector),
    );

    // Authentication and session
    app.use(session({
        secret: 'This is a super secret dev secret that you cant share with anyone',
        resave: false,
        saveUninitialized: false,
        rolling: true,
        cookie: {
            maxAge: SESSION_TOKEN_DURATION_MINUTES * 60 * 1000,     // property maxAge requires milliseconds
            httpOnly: true,
        },
        store: new PrismaSessionStore(prisma_postgres, {
            sessionModelName: 'sessions',
            checkPeriod: SESSION_TOKEN_DURATION_MINUTES * 60 * 1000,  //ms
            dbRecordIdIsSessionId: true,
            dbRecordIdFunction: undefined,
        })
    }))
    app.use(passport.initialize());
    app.use(passport.session());

    // Enable CORS
    app.enableCors({
        origin: ['http://10.100.251.2:9011', 'http://10.5.14.111:9012', 'http://10.100.251.2:9013', 'http://localhost:9000', 'https://app.targo.ca', 'https://portail.targo.ca', 'https://staging.app.targo.ca'],
        credentials: true,
    });

    await app.listen(process.env.PORT ?? 3000);

}
bootstrap();
