import { DynamicModule, flatten, Module } from '@nestjs/common';
import { AsyncModelFactory } from './interface/async-model-factory.interface';
import { createAppwriteAsyncProviders } from './appwrite.providers';
import { AppwriteModuleOptions } from './interface/appwrite-module-options.interface';
import { AppwriteCoreModule } from './appwrite-core.module';

@Module({})
export class AppwriteModule {

  static forRoot(options: AppwriteModuleOptions): DynamicModule {
    return {
      module: AppwriteModule,
      imports: [AppwriteCoreModule.forRoot(options)],
    };
  }

  static forFeatureAsync(
    factories: AsyncModelFactory[] = [],
  ): DynamicModule {
    const providers = createAppwriteAsyncProviders(factories);
    const imports = factories.map((factory) => factory.imports || []);
    const uniqImports = new Set(flatten(imports));

    return {
      module: AppwriteModule,
      imports: [...uniqImports],
      providers: providers,
      exports: providers,
    };
  }
}
