import { InjectionToken, NgModule, Type } from '@angular/core';
import type { StrictOmit } from 'ts-gems';
import { AngularBackend } from '../angular-backend.js';

export type OpraClientModuleOptions = AngularBackend.Options & {
  serviceUrl: string;
  token?: string | InjectionToken<any>;
};

type _OpraClientModuleOptions = StrictOmit<OpraClientModuleOptions, 'token'>;

export interface OpraModuleOptionsFactory {
  createOptions(): Promise<_OpraClientModuleOptions> | _OpraClientModuleOptions;
}

export interface OpraClientModuleAsyncOptions
  extends Pick<NgModule, 'imports' | 'providers'> {
  token?: string | InjectionToken<any>;
  useExisting?: Type<OpraModuleOptionsFactory>;
  useClass?: Type<any>;
  useFactory?: (
    ...args: any[]
  ) => Promise<_OpraClientModuleOptions> | _OpraClientModuleOptions;
  deps?: any[];
}
