import { AgoraEduEvent } from '../declare';
import { ReactElement } from 'react';
import { EduScenarioAppStore } from '../../stores';
export declare enum EduSDKInternalStateEnum {
    Created = "created",
    Initialized = "initialized",
    Destroyed = "destroyed"
}
export declare type EventCallableFunction = (evt: AgoraEduEvent) => any;
export declare type LifeEventFunction = (...args: any[]) => never;
export declare type ControllerLifeEvents = {
    onControllerDestroy: LifeEventFunction;
};
export declare abstract class ClassRoomAbstractStore {
    constructor();
    destroy: () => Promise<any>;
}
export declare class ClassRoom<T extends ClassRoomAbstractStore> {
    private readonly store;
    private dom;
    private readonly controller;
    constructor(context: EduSDKController<T>);
    destroy(): Promise<void>;
}
export declare class EduSDKController<T extends ClassRoomAbstractStore> {
    private room;
    private dom;
    callback: EventCallableFunction;
    globalStore: any;
    /**
     * onControllerLifeCycle
     */
    private onControllerDestroy;
    /**
     * controller的状态
     */
    private _state;
    private _lock;
    constructor();
    get hasCalled(): boolean;
    get lock(): boolean;
    acquireLock(): () => void;
    get isInitialized(): boolean;
    getClassRoom(): ClassRoom<T>;
    get state(): EduSDKInternalStateEnum;
    create(component: ReactElement, dom: HTMLElement, callback: EventCallableFunction): void;
    subscribe({ onControllerDestroy }: ControllerLifeEvents): void;
    setupStore(context: EduScenarioAppStore): void;
    destroy(): Promise<void>;
}
export declare class MainController {
    readonly appController: EduSDKController<ClassRoomAbstractStore>;
    readonly replayController: EduSDKController<ClassRoomAbstractStore>;
    readonly storageController: EduSDKController<ClassRoomAbstractStore>;
    constructor(appController?: EduSDKController<ClassRoomAbstractStore>, replayController?: EduSDKController<ClassRoomAbstractStore>, storageController?: EduSDKController<ClassRoomAbstractStore>);
    getAppClassRoom(): ClassRoom<ClassRoomAbstractStore>;
}
