import { RVDashboardDataSource } from "./sdk-model/AbstractClasses/RVDashboardDataSource";
import { RVDataSourceItem } from "./sdk-model/AbstractClasses/RVDataSourceItem";
import { IncomingMessage, RequestListener } from 'http';
import { IDashboardExporter } from "./exporter/exporter";
import { IRVUserContext } from "./IRVUserContext";
import { Readable } from "stream";

export { IDashboardExporter} from "./exporter/exporter";
export { IDashboardTheme} from "./exporter/DashboardTheme";
export { IRVUserContext } from "./IRVUserContext";

export * from "./exporter/ExportOptions";
export * from "./sdk-model/rvDataSourceExports"

export declare class RVUserContext implements IRVUserContext {
    constructor(userId: string, properties: Map<string, Object>);

    get userId(): string;
    get properties(): Map<string, Object>;
}

export declare interface IRVDataSourceCredential {
}

export declare class RVUsernamePasswordDataSourceCredential implements IRVDataSourceCredential {
    constructor(userName: string, password: string, domain?: string);
    get userName(): string;
    get password(): string;
    get domain(): string | null;
}

export declare class RVBearerTokenDataSourceCredential implements IRVDataSourceCredential {
    constructor(token: string, userId?: string);
    get token(): string;
    get userId(): string | null;
}

export declare class RVHeadersDataSourceCredentials implements IRVDataSourceCredential {
    constructor();
    constructor(headers:Map<string, string>);
    constructor(singleHeaderName:string, singleHeaderValue:string);
    get headers(): Map<string, string>;
    addHeader(singleHeaderName:string, singleHeaderValue:string): void;
}

export declare class RVAmazonWebServicesCredentials implements IRVDataSourceCredential {
    constructor(key: string, secret: string, sessionToken?: string);
    get key(): string;
    get secret(): string;
    get sessionToken(): string | null;
}

export declare class RVIntegratedAuthenticationCredential implements IRVDataSourceCredential {
    constructor();
}

export declare type RevealOptions = {
    basePath?: string,
    cachePath?: string,
    engineLogDir?: string,
    engineLogLevel?: string,
    license?: string,
    localFileStoragePath?: string,
    authenticationProvider?: (userContext:IRVUserContext | null, dataSource:RVDashboardDataSource) => Promise<IRVDataSourceCredential | null>,
    dashboardProvider?: (userContext:IRVUserContext | null, dashboardId:string) => Promise<Readable | null>,
    dashboardStorageProvider?: (userContext:IRVUserContext | null, dashboardId: string, stream: Readable) => Promise<void>,
    userContextProvider?: (request:IncomingMessage) => IRVUserContext | null,
    dataSourceProvider?: (userContext: IRVUserContext | null, dataSource: RVDashboardDataSource) => Promise<RVDashboardDataSource | null>,
    dataSourceItemProvider?: (userContext: IRVUserContext | null, dataSource: RVDataSourceItem) => Promise<RVDataSourceItem | null>,
    dataSourceItemFilter?: (userContext: IRVUserContext | null, dataSourceItem: RVDataSourceItem) => Promise<boolean>,
    _internal_revealEnginePrgPath?: string,
    advancedSettings?: Map<string, Object>,
    maxFilterSize?: Number,
    dataSources?: Array<string>,
    isLegacyCacheEnabled?: boolean,
    enableCacheEncryption?: boolean,
    cacheEncryptionPassword?: string
}

export declare class RevealServer {
    close(callback?: () => void): void;
    exporter: IDashboardExporter;
}

export declare type RevealRequestListener = RequestListener & RevealServer;

export default function create(options?: RevealOptions): RevealRequestListener;
