/**
 * AuthModule — модуль аутентификации ИНФУД v6.4.
 *
 * Экспортирует:
 *  - AuthService  — для HealthService.sessionCount и других модулей
 *  - JwtModule    — чтобы другие модули могли верифицировать токены
 */
import { Module }         from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtModule }      from '@nestjs/jwt';
import * as fs   from 'fs';
import * as path from 'path';
import * as crypto from 'crypto';

import { AuthService }    from './auth.service';
import { AuthController } from './auth.controller';
import { JwtStrategy }    from './jwt.strategy';

/** Загружаем секрет JWT из data/.jwt_secret (или генерируем при первом запуске) */
function loadOrCreateSecret(): string {
  const dataDir = process.env.DATA_DIR ?? path.join(process.cwd(), 'data');
  const file    = path.join(dataDir, '.jwt_secret');
  try {
    if (fs.existsSync(file)) {
      const s = fs.readFileSync(file, 'utf8').trim();
      if (s.length >= 32) return s;
    }
  } catch (_) {}
  // Генерируем новый секрет (48 байт = 96 символов hex)
  const secret = process.env.JWT_SECRET ?? crypto.randomBytes(48).toString('hex');
  fs.mkdirSync(dataDir, { recursive: true });
  fs.writeFileSync(file, secret, { mode: 0o600 });
  return secret;
}

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret:      loadOrCreateSecret(),
      signOptions: {
        expiresIn: process.env.JWT_EXPIRES ?? '8h',
        // issuer для аудита
        issuer:    'infud-v6.4',
      },
    }),
  ],
  providers:   [AuthService, JwtStrategy],
  controllers: [AuthController],
  // Экспортируем AuthService для использования в HealthModule и других
  exports:     [AuthService, JwtModule],
})
export class AuthModule {}
