import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ScheduleModule } from '@nestjs/schedule';
import { SeederService } from './seeder.service';
import { MulterModule } from '@nestjs/platform-express';
import { ConfigModule } from '@nestjs/config';
import { LoggingMiddleware } from './middleware/logging.middleware';
import { RateLimiterMiddleware } from './middleware/rate-limiter.middleware';
import { join } from 'path';

import { AuthModule } from './modules/auth/auth.module';
import { SeederRun } from './seeder/run-seeder';

// Entities
import { Users } from './entities/users.entity';
import { Industries } from './entities/industries.entity';
import { BrandIndustries } from './entities/brand-industries.entity';
import { Categories } from './entities/categories.entity';
import { SocialMedias } from './entities/social-medias.entity';
import { FileManagers } from './entities/file-managers.entity';
import { FileLogs } from './entities/file-logs.entity';

// Module
import { profileImageConfig } from './common/config/multer.config';

// import { CronModule } from './cron/cron.module';
import { LoggingService } from './common/config/logging.service';
import { BrandRegisterModule } from './modules/brand-register/brand-register.module';
import { IndustriesModule } from './modules/Industries/industries.module';
import { CategoriesModule } from './modules/categories/categories.module';
import { KeywordsModule } from './modules/keywords/keywords.module';
import { InfluencerRegisterModule } from './modules/influencer-register/influencer-register.module';
import { YoutubeChannels } from './entities/youtube-channel.entity';
import { YoutubeVideos } from './entities/youtube-videos.entity';
import { FacebookPages } from './entities/facebook-pages.entity';
import { FacebookPosts } from './entities/faceboook-posts.entity';
import { InstagramMedias } from './entities/instagram-medias.entity';
import { InstagramProfiles } from './entities/instagram-profile.entity';
import { InfluencerCategory } from './entities/influencer-caregories.entity';
import { TikTokProfiles } from './entities/tiktok-profile.entity';
import { XiaohongshuProfiles } from './entities/xiaohongshu-profile.entity';
import { TikTokVideos } from './entities/tiktok-videos.entity';
import { SettingsModule } from './modules/settings/settings.module';
import { ConfigurationsModule } from './modules/configurations/configurations.module';
import { AdminModule } from './modules/admin/admin.module';

import { Settings } from './entities/settings.entity';
import { Configurations } from './entities/configurations.entity';
import { SocialMediaPosts } from './entities/social-media-posts.entity';
import { BrowseInfluencerModule } from './modules/browse-influencer/browse-influencer.module';
import { CommonModule } from './modules/common/common.module';
import { PlanModule } from './modules/plan/plan.module';
import { Plan } from './entities/plan.entity';
import { PlanPermission } from './entities/plan-permission.entity';
import { FileManagerModule } from './modules/file-manager/file-manager.module';
import { CronModule } from './cron/cron.module';
import { FacebookModule } from './common/services/facebook/facebook.module';
import { Card } from './entities/card.entity';
import { PaymentModule } from './modules/payment/payment.module';
import { Faqs } from './entities/faqs.entity';
import { FaqsModule } from './modules/faqs/faqs.module';
import { Countries } from './entities/countries.entity';
import { CmsModule } from './modules/cms/cms.module';
import { Cms } from './entities/cms.entity';
import { Subscription } from './entities/subscription.entity';
import { SubscriptionHistory } from './entities/subscription-history.entity';
import { WebhookModule } from './modules/webhook/webhook.module';
import { BrandFavorite } from './entities/brand-favorit.entity';
import { Keywords } from './entities/keywords.entity';
import { UserKeywords } from './entities/user-keywords.entity';
import { ApifyModule } from './common/services/apify/apify.module';
import { Campaign } from './entities/campaign.entity';
import { CanpaignModule } from './modules/campaign/campaign.module';
import { CampaignInfluencer } from './entities/campaign_influencer.entity';
import { CampaignInfluencerBookmarks } from './entities/campaign_influencer_bookmark.entity';
import { Draft } from './entities/draft.entity';
import { DraftVersions } from './entities/draft_versions.entity';
import { DraftComments } from './entities/draft_comments.entity';
import { CampaignRepository } from './modules/campaign/campaign.repository';
import { Posts } from './entities/posts.entity';
import { RejectCompletionRequest } from './entities/reject-completion-request.entity';
import { SocketGateway } from './common/services/socket/socket.gateway';
import { InfluenceSaveCampaigns } from './entities/influencer-save-campaigns.entity';
import { Dispute } from './entities/dispute.entity';
import { DisputeHistory } from './entities/dispute-history.entity';
import { DisputeModule } from './modules/dispute/dispute.module';
import { Advertisement } from './entities/advertisement.entity';
import { AdvertisementModule } from './modules/advertisement/advertisement.module';
import { CurrencyRate } from './entities/currency_rates.entity';
import { CampaignPayment } from './entities/campaign_payment.entity';
import { CampaignPaymentHistory } from './entities/campaign_payment_history.entity';
import { Notifications } from './entities/notifications.entity';
import { StripeModule } from './common/services/payment-gateway/stripe/stripe.module';
import { BankDetails } from './entities/bank-details.entity';
import { CampaignCategory } from './entities/campaign-caregories.entity';
import { CampaignRecommended } from './entities/campaign_recommended.entity';
import { InfluencerCampaignRecommended } from './entities/influencer_campaign_recommended.entity';
import { ApifyScraper } from './entities/apify-screper.entity';
import { InstagramInsights } from './entities/instagram-insights.entity';
import { UserPermissions } from './entities/user-permissions.entity';
import { EncryptionModule } from './common/services/encryption/encryption.module';
import { EncryptionService } from './common/services/encryption/encryption.service';
import { YoutubesModule } from './common/services/youtube/youtube.module';
import { CacheModule } from '@nestjs/cache-manager';
import { GuestUserProfileAccess } from './entities/guest_user_profile_access.entity';
import { ErrorLogModule } from './common/services/error-logs/error-log.module';
import { NotificationPreferencesModule } from './modules/notification-preferences/notification-preferences.module';
import { APP_FILTER } from '@nestjs/core';
import { GlobalExceptionFilter } from './common/services/error-logs/global-exception.filter';
import { ErrorLog } from './entities/error-log.entity';
import { ErrorReport } from './entities/error-report.entity';
import { SearchLog } from './entities/search-logs.entity';
import { UserNotificationPreferences } from './entities/user-notification-preferences.entity';
import { CategoryTranslation } from './entities/category-translations.entity';
import { KeywordTranslation } from './entities/keyword-translations.entity';
import { McpModule } from './common/services/mcp/mcp.module';
import { PaymentMethodModule } from './modules/payment-method/payment-method.module';
import { PaymentMethod } from './entities/payment-method.entity';
import { CountryPaymentMethod } from './entities/country-payment-method.entity';
import { InfluencerPaymentMethod } from './entities/influencer-payment-method.entity';
import { WhatsAppMessage } from './entities/whatsapp-messages.entity';
import { CountryRecommendedCategory } from './entities/country-recommended-categories.entity';
import { CampaignCategoryCountryOrder } from './entities/campaign-category-country-order.entity';
import { AiReportLog } from './entities/ai_report_log.entity';
// BullMQ disabled for AI reports — using in-process background instead
// import { QueueModule } from './common/services/queue/queue.module';
import { CampaignAiReport } from './entities/campaign-ai-report.entity';


@Module({
  imports: [
    EncryptionModule,
    // QueueModule,
    ScheduleModule.forRoot(),
    CacheModule.register({ isGlobal: true }),
    // ConfigModule.forRoot({
    //   envFilePath: envFilePath,
    //   isGlobal: true,
    // }),

    //MulterModule.register(profileImageConfig),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DB_HOST,
      port: 5432,
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      synchronize: false,
      ssl: {
        rejectUnauthorized: false
      },
      //  entities: ['dist/src/entities/*{.ts,.js}'],
      entities: [Users, CategoryTranslation, KeywordTranslation, Industries, BrandIndustries, Categories, SocialMedias, YoutubeChannels, YoutubeVideos, FacebookPages,
        FacebookPosts, InstagramMedias, InstagramProfiles, InstagramInsights, InfluencerCategory, TikTokProfiles, TikTokVideos, Settings, Configurations, SocialMediaPosts,
        FileManagers, FileLogs, XiaohongshuProfiles, Plan, PlanPermission, Card, Faqs, Countries, Cms, Subscription, SubscriptionHistory, BrandFavorite, Keywords,
        UserKeywords, Campaign, CampaignInfluencer, CampaignInfluencerBookmarks, Draft, DraftVersions, DraftComments, Posts, RejectCompletionRequest,
        InfluenceSaveCampaigns, Dispute, DisputeHistory, Advertisement, CurrencyRate, CampaignPayment, CampaignPaymentHistory, Notifications, BankDetails, CampaignCategory,
        CampaignRecommended, InfluencerCampaignRecommended, ApifyScraper, UserPermissions, GuestUserProfileAccess, ErrorLog, ErrorReport, SearchLog, PaymentMethod, CountryPaymentMethod,
        InfluencerPaymentMethod, UserNotificationPreferences, WhatsAppMessage, CountryRecommendedCategory, CampaignCategoryCountryOrder, AiReportLog, CampaignAiReport],
    }),
    TypeOrmModule.forFeature([Users, SocialMedias, Draft, Settings]),
    AuthModule,
    BrandRegisterModule,
    IndustriesModule,
    CategoriesModule,
    KeywordsModule,
    InfluencerRegisterModule,
    SettingsModule,
    ConfigurationsModule,
    AdminModule,
    BrowseInfluencerModule,
    CommonModule,
    PlanModule,
    FileManagerModule,
    FacebookModule,
    CronModule,
    PaymentModule,
    FaqsModule,
    CmsModule,
    WebhookModule,
    ApifyModule,
    CanpaignModule,
    DisputeModule,
    AdvertisementModule,
    StripeModule,
    ErrorLogModule,
    PaymentMethodModule,
    McpModule,
    NotificationPreferencesModule,
  ],
  providers: [EncryptionService,
    LoggingService,
    SeederRun,
    SocketGateway,
    {
      provide: APP_FILTER,
      useClass: GlobalExceptionFilter,
    },
  ],
  // providers: [SeederService],
  // providers: [SeederService],
  //exports: [SocialMediasServices],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(RateLimiterMiddleware)
      // .forRoutes('v1/auth/login');
      .forRoutes('*');

    consumer
      .apply(LoggingMiddleware)
      .forRoutes('*');
  }
}
