import { Module } from '@nestjs/common';
/**
 * AppModule: Root Module for the Ads Analytics SaaS
 * هنا نقوم بتعريف جميع الوحدات والخدمات التي سيعمل بها النظام
 */
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { HealthModule } from './health/health.module';
import { MetaAdsModule } from './meta-ads/meta-ads.module';
import { AnalyticsModule } from './analytics/analytics.module';
import { UsersModule } from './users/users.module';
import { AuthModule } from './auth/auth.module';
import { PaymentsModule } from './payments/payments.module';
import { AutomationModule } from './automation/automation.module';
import { NotificationModule } from './notifications/notification.module';
import { ScheduleModule } from '@nestjs/schedule';
import { CacheModule } from '@nestjs/cache-manager';
import { redisStore } from 'cache-manager-redis-yet';
import configuration from './config/configuration';
import { validate } from './config/env.validation';
import { AppController } from './app.controller';

/**
 * App Module
 * الوحدة الأساسية للتطبيق
 * 
 * Why: This is the root of everything. We import ConfigModule globally here.
 * لماذا: هذا هو جذر كل شيء. نقوم باستيراد وحدة الإعدادات عالمياً هنا.
 */
@Module({
  imports: [
    // Configuration Module | وحدة الإعدادات
    ConfigModule.forRoot({
      isGlobal: true, // Make settings available everywhere | جعل الإعدادات متاحة في كل مكان
      load: [configuration], // Load factory | تحميل المصنع
      validate, // Validation function | وظيفة التحقق
    }),
    ScheduleModule.forRoot(),
    // TypeORM Configuration | إعدادات قاعدة البيانات
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        type: 'postgres',
        host: config.get<string>('database.host'),
        port: config.get<number>('database.port'),
        username: config.get<string>('database.username'),
        password: config.get<string>('database.password'),
        database: config.get<string>('database.database'),
        autoLoadEntities: true, // Automatically load entities | تحميل الكيانات لقائياً
        synchronize: true, // Auto create/update tables (DEV ONLY) | إنشاء وتحديث الجداول تلقائياً (للتطوير فقط)
      }),
    }),
    HealthModule,
    MetaAdsModule,
    AnalyticsModule,
    UsersModule,
    AuthModule,
    PaymentsModule,
    // Automation Module (SaaS Pro) | وحدة الأتمتة
    AutomationModule,
    // Notification Module (SaaS Pro) | وحدة التنبيهات
    NotificationModule,
    // Cache Module (Redis with In-Memory fallback) | وحدة التخزين المؤقت
    CacheModule.registerAsync({
      isGlobal: true,
      inject: [ConfigService],
      useFactory: async (config: ConfigService) => {
        try {
          const host = config.get<string>('redis.host');
          const port = config.get<number>('redis.port');
          
          const store = await redisStore({
            socket: { host, port },
            ttl: 60 * 60, // 1 hour
          });
          
          return { store };
        } catch (error) {
          // Fallback to memory store if Redis is unavailable | العودة للتخزين في الذاكرة في حال عدم توفر ريديس
          return {
            ttl: 60 * 60,
          };
        }
      },
    }),
  ],
  controllers: [AppController],
  providers: [],
})
export class AppModule {}
