import { TokenStore } from '@croct/sdk/token';
import { EvaluatorFacade } from '@croct/sdk/facade/evaluatorFacade';
import { TrackerFacade } from '@croct/sdk/facade/trackerFacade';
import { SdkEventManager } from './sdk/index.cjs';
import { UserFacade } from '@croct/sdk/facade/userFacade';
import { SessionFacade } from '@croct/sdk/facade/sessionFacade';
import { Tab } from '@croct/sdk/tab';
import { CidAssigner } from '@croct/sdk/cid';
import { Logger } from '@croct/sdk/logging';
import '@croct/sdk/eventManager';
import '@croct/sdk/sdkEvents';

interface PluginSdk {
    readonly version: string;
    readonly appId: string;
    readonly tracker: TrackerFacade;
    readonly evaluator: EvaluatorFacade;
    readonly user: UserFacade;
    readonly session: SessionFacade;
    readonly tab: Tab;
    readonly userTokenStore: TokenStore;
    readonly previewTokenStore: TokenStore;
    readonly cidAssigner: CidAssigner;
    readonly eventManager: SdkEventManager;
    getLogger(...namespace: string[]): Logger;
    getTabStorage(...namespace: string[]): Storage;
    getBrowserStorage(...namespace: string[]): Storage;
}
interface PluginArguments<T = any> {
    options: T;
    sdk: PluginSdk;
}
interface PluginFactory<T = any> {
    (args: PluginArguments<T>): Plugin;
}
interface Plugin {
    enable(): Promise<void> | void;
    disable?(): Promise<void> | void;
}

export type { Plugin, PluginArguments, PluginFactory, PluginSdk };
