import {Type} from '@nestjs/common';
import {ModuleMetadata} from '@nestjs/common/interfaces';

import {Connection, ConnectionOptions} from '../orm';

export type ScyllaModuleOptions = {
    keepConnectionAlive?: boolean;
    retryAttempts?: number;
    retryDelay?: number;
    isGlobal?: boolean;
} & Partial<ConnectionOptions>;

export type ScyllaFeaturesModuleOptions = {
    entities: Function[];
    isGlobal?: boolean;
    connection?: Connection | ConnectionOptions | string;
};

export interface ScyllaOptionsFactory {
    createScyllaOptions(): Promise<ScyllaModuleOptions> | ScyllaModuleOptions;
}

export interface ScyllaModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
    name?: string;
    inject?: any[];
    isGlobal?: boolean;
    useClass?: Type<ScyllaOptionsFactory>;
    useExisting?: Type<ScyllaOptionsFactory>;
    useFactory?: (...args: any[]) => Promise<ScyllaModuleOptions> | ScyllaModuleOptions;
}
