module.exports = new Class({
	basePath: null,
	path: null,
	moduleName: null,
	resolvers: null,
	status: null,

	initialize(basePath, path) {
		const aux = path.split('/');
		const moduleName = aux[aux.length - 1];

		this.basePath = basePath;
		this.path = path;
		this.moduleName = moduleName;
	},

	async load() {
		switch(this.status) {
			case 'ready':
				return;
			case 'loading':
				return new Promise((resolve, reject) => {
					this.resolvers.push(status => {
						if (status == 'error')
							return reject(new Error(`Module could not be loaded`));
						resolve();
					});
				});
		}

		this.status = 'loading';
		this.resolvers = [];
		const absPath = `${this.basePath}/${this.path}`;
		const requests = [
			Vn.includeJs(`${absPath}/${this.moduleName}.js`),
			Vn.loadXml(`${absPath}/ui.xml`)
		];

		try {
			await Vn.Locale.load(absPath);
		} catch(err) {
			console.err(err);
		}

		try {
			await Promise.all(requests);
			const klassName = this.toCamelCase(this.moduleName);
			this.klass = Hedera[klassName];
			this.status = 'ready';
		} catch (err) {
			this.status = 'error';
			console.error(err);
		}

		for (const resolver of this.resolvers)
			resolver(this.status);

		this.resolvers = null;
	}
	
	,toCamelCase(dashedName) {
		var camelCase = dashedName.charAt(0).toUpperCase();
		camelCase += dashedName.substr(1).replace(/\w-\w/g, function(token) {
			return token.charAt(0) + token.charAt(2).toUpperCase();
		});
		return camelCase;
	}
});