import { NestFactory } from '@nestjs/core';
import * as dotenv from 'dotenv';
console.log(process.env.NODE_ENV)
const envFilePath = process.env.NODE_ENV == 'production' ? '.env' : `.env.${process.env.NODE_ENV || 'development'}`;
console.log(envFilePath)
dotenv.config({ path: envFilePath });
import { AppModule } from './app.module';
import { Logger, VersioningType } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { ValidationPipe } from './validation-pipe/validation.pipe';
// import { SeederService } from './seeder.service';
import { AllExceptionsFilter } from './common/config/exceptions-logger';
import * as bodyParser from 'body-parser';
import { RedisIoAdapter } from './common/adapters/redis.adapter';
// import * as express from 'express';
// import * as path from 'path';

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

  app.use(
    '/v1/webhook/stripe',
    bodyParser.raw({ type: 'application/json' }),
  );
  // Get the underlying express instance
  const expressApp = app.getHttpAdapter().getInstance();
  const cors = require('cors');
  app.use(cors({ origin: '*' }));
  app.getHttpAdapter().getInstance().set('trust proxy', true);
  // Enable trust proxy
  expressApp.set('trust proxy', 1);

  expressApp.get('/', (req, res) => {
    res.status(200).json({ message: 'Connector API is running...' });
  });

  app.enableVersioning({
    defaultVersion: '1',
    type: VersioningType.URI,
  });

  try {
    const redisAdapter = new RedisIoAdapter(app);
    await redisAdapter.connectToRedis();
    app.useWebSocketAdapter(redisAdapter);
    console.log('✅ Redis adapter applied');
  } catch (err) {
    console.error('❌ Redis connection failed:', err);
  }

  app.enableCors();
  app.useGlobalPipes(new ValidationPipe());
  //app.useGlobalFilters(new AllExceptionsFilter());
  //app.use(bodyParser.urlencoded({ extended: true }));
  //app.use(bodyParser.json());
  //app.use(bodyParser.json({ limit: '50mb' }));
  app.use((req: any, res: any, next: any) => {
    // Match both /mcp and /v1/mcp (in case version prefix varies)
    if (req.path === '/v1/mcp' || req.path === '/mcp' ||
      req.path.startsWith('/v1/mcp/') || req.path.startsWith('/mcp/')) {
      return next(); // Skip ALL body parsing for MCP
    }
    bodyParser.urlencoded({ extended: true })(req, res, (err) => {
      if (err) return next(err);
      bodyParser.json({ limit: '50mb' })(req, res, next);
    });
  });

  if (process.env.NODE_ENV !== 'production') {
    initializeSwagger(app);
  }

  // const downloadsPath = path.join(__dirname, '..', 'src', 'download');
  // app.use('/downloads', express.static(downloadsPath));
  //app.use('/storage', express.static('path/to/your/storage/folder'));
  // const seederService = app.get(SeederService);
  // console.log(seederService);
  // await seederService.seedUsers();
  const server = await app.listen(3015, '0.0.0.0');
  // const server = await app.listen(9494,'0.0.0.0');
  // const server = await app.listen(8586);
  // console.log(server);
  Logger.debug(`🚀  Server is listening on port 3015`);
}

function initializeSwagger(app) {
  const config = new DocumentBuilder()
    .addBearerAuth({
      type: 'http',
      scheme: 'Bearer',
      bearerFormat: 'JWT',
      in: 'header',
    }, 'access-token')
    .setTitle('Connector Club API')
    .setDescription('Connector Club API 🚀')
    .setVersion('v1')
    .build();

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

bootstrap().catch((e) => {
  Logger.error(`❌  Error starting server, ${e}`);
  throw e;
});
