/**
 * ╔═══════════════════════════════════════════════════════════════╗
 * ║  AppModule — корневой модуль ИНФУД v6.4 NestJS               ║
 * ║  Шаг 1: Стабильный пилот                                     ║
 * ╚═══════════════════════════════════════════════════════════════╝
 *
 * Порядок imports:
 *   1. NestConfigModule — переменные окружения (должен быть первым)
 *   2. ThrottlerModule  — глобальный rate limiting (APP_GUARD)
 *   3. @Global() модули — LkvModule, FeaturesModule, AppConfigModule
 *   4. AuthModule       — JWT + Passport (нужен всем guards)
 *   5. Функциональные модули — Device, Sensor, Health, ERP, Telegram
 *
 * Модули шага 2 (Alarm, Stops, Plants, WebSocket, Reports, Telephony)
 * добавляются сюда по мере разработки без изменения существующих.
 */

import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { ConfigModule as NestConfigModule }        from '@nestjs/config';
import { ThrottlerModule, ThrottlerGuard }         from '@nestjs/throttler';
import { APP_GUARD }                               from '@nestjs/core';

/* ── @Global() модули (singleton, доступны везде) ─────────────── */
import { LkvModule }      from './modules/store/lkv.module';
import { FeaturesModule } from './config/features.module';     // ← FeatureFlagsService
import { AppConfigModule }from './modules/config/config.module'; // ← AppConfigService

/* ── Аутентификация ───────────────────────────────────────────── */
import { AuthModule }     from './modules/auth/auth.module';

/* ── Функциональные модули ────────────────────────────────────── */
import { DeviceModule }   from './modules/device/device.module';
import { SensorModule }   from './modules/sensor/sensor.module';
import { HealthModule }   from './modules/health/health.module';
import { ErpModule }      from './modules/erp/erp.module';
import { TelegramModule } from './modules/telegram/telegram.module';

/* ── Middleware ───────────────────────────────────────────────── */
import { LoggerMiddleware } from './common/interceptors/logger.middleware';
import { PlantMiddleware }  from './common/interceptors/plant.middleware';

@Module({
  imports: [
    /* Переменные окружения (.env) — isGlobal:true делает ConfigService доступным везде */
    NestConfigModule.forRoot({ isGlobal: true, envFilePath: '.env' }),

    /* Глобальный Rate Limiting:
     *   60 запросов / 1 мин  — базовый лимит
     *   Конкретные эндпоинты переопределяют через @Throttle()
     *   Пример: login → 10/min, forgot → 5/min
     */
    ThrottlerModule.forRoot([{
      name:  'default',
      ttl:   60_000, // мс
      limit: 60,
    }]),

    /* @Global() — достаточно импортировать один раз */
    LkvModule,        // In-Memory LKV: getSensors(), getResources(), getErpStatus()
    FeaturesModule,   // FeatureFlagsService: isEnabled('MODBUS'), set('ALARMS', false)
    AppConfigModule,  // AppConfigService: get('tgToken'), update({odinEnabled: true})

    /* Аутентификация (AuthService нужен HealthService, UsersModule и т.д.) */
    AuthModule,

    /* Производство */
    DeviceModule,     // /api/devices, /api/catalog + Modbus/OPC-UA polling
    SensorModule,     // /api/sensors, /api/resources + симуляция

    /* Мониторинг */
    HealthModule,     // /api/health, /api/health/full

    /* Интеграции */
    ErpModule,        // /api/erp/* + периодическая синхронизация с 1С
    TelegramModule,   // /api/telegram/webhook + polling Telegram Bot
  ],

  providers: [
    /* ThrottlerGuard применяется глобально ко всем маршрутам.
     * Отдельные маршруты могут переопределить через:
     *   @SkipThrottle() — отключить
     *   @Throttle({ default: { limit: 5, ttl: 60000 } }) — переопределить
     */
    {
      provide:  APP_GUARD,
      useClass: ThrottlerGuard,
    },
  ],
})
export class AppModule implements NestModule {
  /**
   * Middleware порядок:
   *   1. PlantMiddleware  — добавляет req.plant (Multi-plant context)
   *   2. LoggerMiddleware — логирует METHOD /path → status (Xms)
   */
  configure(consumer: MiddlewareConsumer): void {
    consumer
      .apply(PlantMiddleware, LoggerMiddleware)
      .exclude('/favicon.ico')
      .forRoutes('*');
  }
}
