import * as path from 'path';
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Word } from './words/entities/word.entity';
import { Definition } from './words/entities/definition.entity';
import { User } from './auth/entities/user.entity';
import { WordsModule } from './words/words.module';
import { AuthModule } from './auth/auth.module';
import { MailModule } from './mail/mail.module';

@Module({
  imports: [
    // Make .env variables available throughout the app
    ConfigModule.forRoot({
      isGlobal: true,
      // Absolute path so Passenger CWD doesn't matter
      envFilePath: path.join(__dirname, '..', '.env'),
    }),

    // Async TypeORM setup — reads DB config from environment variables
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        type: 'mysql' as const,
        host: config.get<string>('DB_HOST', 'localhost'),
        port: config.get<number>('DB_PORT', 3306),
        username: config.get<string>('DB_USER', 'lexibrain'),
        password: config.get<string>('DB_PASSWORD', 'lexibrain'),
        database: config.get<string>('DB_NAME', 'lexibrain'),
        entities: [Word, Definition, User],
        // synchronize:true auto-creates/updates tables in dev.
        // MUST be disabled in production — use migrations instead.
        synchronize: config.get<string>('NODE_ENV') !== 'production',
      }),
    }),

    AuthModule,
    MailModule,
    WordsModule,
  ],
})
export class AppModule {}
