import { CONST, ERROR_CODES, WARNING_CODES } from "../constants.js";
import { Exception, Warning } from "./Exception.js";
import { SystemSocketConnection } from "./SystemSocketConnection.js";
import { SystemAudioInterface } from "./SystemAudioInterface.js";
import { SystemSettings } from "../configs.js";
import AssetsManager from "../../node_modules/assetsm/dist/assetsm.min.js";
import { DrawObjectFactory } from "./DrawObjectFactory.js";
import { ScreenPage } from "./ScreenPage.js";
/**
* Public interface for a System<br>
* Can be used to start/stop ScreenPage render, <br>
* And provides access to SystemSettings, SystemSocketConnection and SystemAudioInterface <br>
* accessible via ScreenPage.system and System.system
* @see {@link System} a part of System class instance
* @see {@link ScreenPage} a part of ScreenPage class instance
*/
export class SystemInterface {
/**
* @type {Object}
*/
#systemSettings;
#systemServerConnection;
/**
* @type {SystemAudioInterface}
*/
#systemAudioInterface;
/**
* @type {AssetsManager}
*/
#loader = new AssetsManager();
/**
* @type {DrawObjectFactory}
*/
#drawObjectFactory = new DrawObjectFactory();
/**
* @hideconstructor
*/
#modules = new Map();
constructor(systemSettings, _startScreenPage, _stopScreenPage) {
if (!systemSettings) {
Exception(ERROR_CODES.CREATE_INSTANCE_ERROR, "systemSettings should be passed to class instance");
}
this.#systemSettings = systemSettings;
this.#systemAudioInterface = new SystemAudioInterface(this.loader);
this.#systemServerConnection = new SystemSocketConnection(systemSettings);
this.startScreenPage = _startScreenPage;
this.stopScreenPage = _stopScreenPage;
}
/**
* @type { SystemSocketConnection }
*/
get network () {
return this.#systemServerConnection;
}
/**
* @type { SystemSettings }
*/
get systemSettings() {
return this.#systemSettings;
}
/**
* @type { SystemAudioInterface }
*/
get audio() {
return this.#systemAudioInterface;
}
/**
* @type {AssetsManager}
*/
get loader() {
return this.#loader;
}
/**
* @type {DrawObjectFactory}
*/
get drawObjectFactory() {
return this.#drawObjectFactory;
}
/**
* @type {Map<string, Object>}
*/
get modules() {
return this.#modules;
}
/**
*
* @param {string} moduleKey
* @param {Object} moduleClass
* @param {...any} args
* @returns {Object}
*/
installModule = (moduleKey, moduleClass, ...args) => {
const moduleInstance = new moduleClass(this, ...args);
if (this.#modules.has(moduleKey)) {
Warning(WARNING_CODES.MODULE_ALREADY_INSTALLED, "module " + moduleKey + " is already installed");
return this.#modules.get(moduleKey);
} else {
this.#modules.set(moduleKey, moduleInstance);
}
return moduleInstance;
}
/**
*
* @param {string} createInstanceKey
* @param {*} createInstanceMethod
*/
registerDrawObject(createInstanceKey, createInstanceMethod) {
this.#drawObjectFactory[createInstanceKey] = createInstanceMethod;
}
}