/**
 * Builds a RelaxRNG schema based on currently valid elements.
 *
 * To prevent validation errors, disabled resources are included in the schema.
 *
 * @param datatype - The datatype of the element
 * @param additional - Array of additional data elements. Time, xp, etc.
 * @param subtypes - If true, resource subtypes will be included as well.
 * @return RelaxNG schema string
 */
Resources.prototype.BuildSchema = function(datatype, additional = [], subtypes = false)
{
	if (!datatype)
		return "";

	switch (datatype)
	{
	case "decimal":
	case "nonNegativeDecimal":
	case "positiveDecimal":
		datatype = "<ref name='" + datatype + "'/>";
		break;

	default:
		datatype = "<data type='" + datatype + "'/>";
	}

	const resCodes = this.resourceData.map(resource => resource.code);
	let schema = "";
	for (const res of resCodes.concat(additional))
		schema +=
			"<optional>" +
				"<element name='" + res + "'>" +
					datatype +
				"</element>" +
			"</optional>";

	if (!subtypes)
		return "<interleave>" + schema + "</interleave>";

	for (const res of this.resourceData)
		for (const subtype in res.subtypes)
			schema +=
				"<optional>" +
					"<element name='" + res.code + "." + subtype + "'>" +
						datatype +
					"</element>" +
				"</optional>";

	return "<interleave>" + schema + "</interleave>";
};

/**
 * Builds the value choices for a RelaxNG `<choice></choice>` object, based on currently valid resources.
 *
 * @oaram subtypes - If set to true, the choices returned will be resource subtypes, rather than main types
 * @return String of RelaxNG Schema `<choice/>` values.
 */
Resources.prototype.BuildChoicesSchema = function(subtypes = false)
{
	let schema = "";

	if (!subtypes)
		for (const res of this.resourceData.map(resource => resource.code))
			schema += "<value>" + res + "</value>";
	else
		for (const res of this.resourceData)
			for (const subtype in res.subtypes)
				schema += "<value>" + res.code + "." + subtype + "</value>";

	return "<choice>" + schema + "</choice>";
};

Resources = new Resources();
