import { DynamicModule, Global, Module } from '@nestjs/common';
import { RmqService } from './rmq.service';
import { RmqBroadcastModuleDefinition } from './rmq-broadcast.module-definition';
import {
  AmqpConnection,
  AmqpConnectionManager,
  RabbitMQModule,
} from '@golevelup/nestjs-rabbitmq';
@Global()
@Module({
  providers: [RmqService],
  exports: [],
})
export class RmqBroadCastModule extends RmqBroadcastModuleDefinition.ConfigurableModuleClass {
  static forRoot(options: { config: { uri: string } }): DynamicModule {
    return {
      module: RmqBroadCastModule,
      imports: [
        RabbitMQModule.forRoot(RabbitMQModule, {
          exchanges: [
            {
              name: 'agent.exchange',
              type: 'fanout',
            },
            {
              name: 'call.exchange',
              type: 'fanout',
            },
            {
              name: 'user.caching',
              type: 'fanout',
            },
          ],
          uri: options.config.uri,
          connectionInitOptions: { wait: false },
          enableControllerDiscovery: true,
          channels: {
            'socket-channel': {
              prefetchCount: 15,
              default: true,
            },
          },
        }),
      ],
      exports: [
        RabbitMQModule,
        RmqBroadCastModule,
        AmqpConnection,
        AmqpConnectionManager,
      ],
    };
  }

  static forRootAsync(
    options: typeof RmqBroadcastModuleDefinition.ASYNC_OPTIONS_TYPE,
  ): DynamicModule {
    return {
      module: RmqBroadCastModule,
      imports: [
        ...(options.imports || []),
        RabbitMQModule.forRootAsync(RabbitMQModule, {
          useFactory: async (...args) => {
            const opt = await options.useFactory!(...args);
            return {
              exchanges: [
                {
                  name: 'agent.exchange',
                  type: 'fanout',
                },
                {
                  name: 'user.caching',
                  type: 'fanout',
                },
              ],
              uri: opt.config?.uri || '',
              connectionInitOptions: { wait: false },
              enableControllerDiscovery: true,
              channels: {
                'socket-channel': {
                  prefetchCount: 15,
                  default: true,
                },
              },
            };
          },
          inject: (options.inject as any) || [],
          imports: options.imports || [],
        }),
      ],
      exports: [RabbitMQModule, RmqBroadCastModule],
    };
  }
}
