import ConcurrentExecutor from "../core/process/executor/ConcurrentExecutor";
import View from "../view/View";
import {AssetManager} from "./asset/AssetManager";
import {EntityManager} from "./ecs/EntityManager";
import {GraphicsEngine} from "./graphics/GraphicsEngine";
import KeyboardDevice from "./input/devices/KeyboardDevice";
import {PointerDevice} from "./input/devices/PointerDevice";
import {EnginePlatform} from "./platform/EnginePlatform";
import {EnginePluginManager} from "./plugin/EnginePluginManager";
import SceneManager from "./scene/SceneManager";
import Ticker from "./simulation/Ticker";
import SoundEngine from "./sound/SoundEngine";
import GUIEngine from "./ui/GUIEngine";

export interface IEngineInitializationOptions {
    entityManager?: EntityManager,
    enableAudio?: boolean
    enableGraphics?: boolean
    debug?:boolean
}

export default class Engine {
    constructor(platform: EnginePlatform, options?: IEngineInitializationOptions);

    readonly viewStack: View

    readonly gui:GUIEngine

    public readonly entityManager: EntityManager
    public readonly sceneManager: SceneManager
    public readonly sound: SoundEngine
    public readonly graphics: GraphicsEngine
    public readonly devices: { keyboard: KeyboardDevice, pointer: PointerDevice }
    public readonly assetManager: AssetManager<Engine>
    public readonly ticker: Ticker
    public readonly plugins: EnginePluginManager
    public readonly executor: ConcurrentExecutor

    public start(): Promise<any>

    public stop(): Promise<any>
}
