import { Module, ModuleDeclaration, Container } from 'ditox';

type AnyObject = Record<string, any>;

type LogLevel$1 = 'debug' | 'info' | 'warn' | 'error';
type LogMetadata = Readonly<Record<string, string>>;
type LogEvent$1 = Readonly<{
  timestamp: number;
  level: LogLevel$1;
  tag: string;
  messages: ReadonlyArray<unknown>;
  meta?: LogMetadata;
}>;

type LogLevel = LogLevel$1;
type LogEvent = LogEvent$1;

/**
 * Jazz SDK Plugin provides additional features.
 */
type JazzSdkPlugin<T extends Module<AnyObject> = Module<AnyObject>> = Promise<
  () => {
    key: string | undefined;
    module: JazzSdkModuleDeclaration<T>;
  }
>;
type JazzSdkModuleDeclaration<
  T extends JazzSdkModule<AnyObject> = JazzSdkModule<AnyObject>,
> = ModuleDeclaration<T>;
type JazzSdkModule<T extends AnyObject = AnyObject> = Module<T>;
type JazzSdkAdditionalPlugins = ReadonlyArray<JazzSdkPlugin>;

type JazzSdkElectronMainOptions = {
  container?: Container;
  plugins?: JazzSdkAdditionalPlugins;
};
type JazzSdkElectronMain = {
  container: Container;
  destroy: () => void;
};

declare const createJazzSdkElectronMain: (
  options?: JazzSdkElectronMainOptions,
) => Promise<JazzSdkElectronMain>;

export {
  type JazzSdkElectronMainOptions,
  type JazzSdkPlugin,
  type LogEvent,
  type LogLevel,
  createJazzSdkElectronMain,
};
