let Types = {
	Boolean: 0,
	Text: 1,
	Integer: 2,
	URL: 3,
	somethingelse: 4,
	Link: 5,
	Array: 6,
	View: 7,
	Object: 8,
	Real: 9,
	Float: 10,
	Modules: 11,
	Whatever: 12,
}


class Type {
	constructor(type) {
		this.type = type;
	}

	getType() {
		return Object.keys(Types)[this.type];
	}

	resolve(value) {
		console.log("Called resolve on base super Type component");
		return true;
	}

	default(value) {
		this.defaultValue = value;
		return this;
	}

	require() {
		this.isRequired = true;
		return this;
	}
}

class Bool extends Type {
	constructor() {
		super(Types.Boolean);
	}

	resolve(value) {
		if((value !== undefined || this.isRequired) && value !== true && value !== false) 
			return false;
		return true;
	}
}

class Text extends Type {
	constructor() {
		super(Types.Text);
	}

	color() {
		this.isColor = true;
		return this;
	}

	resolve(value) {
		if(typeof value === "string")
			return true;
		else if ((value === undefined || value === null) && !this.isRequired)
			return true

		return true;
	}
}


class Integer extends Type {
	constructor() {
		super(Types.Integer);
	}

	resolve(value) {
		if (typeof value === "number" && parseInt(value) === value)
			return true;
		else if ((value === undefined || value === null) && !this.isRequired)
			return true;
		return false;
	}
}

class Real extends Type {
	constructor() {
		super(Types.Real);
	}

	resolve(value) {
		if (typeof value === "number" && parseFloat(value) === value)
			return true;
		else if ((value === undefined || value === null) && !this.isRequired)
			return true;
		return false;
	}
}



export default {
	Bool,
	Real,
	Integer,
	Text,
	Types,
	Type
}






// export function Resolver (input, value) {
// 	const msg = "Resolver cannot parse Input Field";
// 	switch (input.type) {
// 		case Types.Object: 
// 			input.value = value || input.value || {};
// 			break;
// 		case Types.Boolean:
// 			if(value !== undefined && value !== null) {
// 				input.value = !!value;
// 			}
// 			break;
// 		case Types.Number:
// 			try {
// 				input.value = parseInt(value === undefined || value === null ? input.value : value);
// 			} catch (e) {
// 				Logger.warning(msg, { inputField: input });
// 			}
// 			break;
// 		case Types.Real:
// 			try {
// 				input.value = parseFloat(value === undefined || value === null ? input.value : value);
// 			} catch (e) {
// 				Logger.warning(msg, { inputField: input });
// 			}
// 			break;
// 		case Types.Text:
// 			if(value !== undefined && value !== null) {
// 				input.value = value;
// 			}
// 			break;
// 		case Types.Array:
// 				if (!Array.isArray(value)) {
// 					try {
// 						if(typeof value === "string") {
// 							input.value = JSON.parse(value);
// 						}
// 					} catch (e) {
// 						Logger.warning(msg, { inputField: input });
// 					}
// 				} else {
// 					input.value = value;
// 				}
// 				break;
// 		default: 
// 			input.value = value;
// 			break;

// 	}
// 	return input.value;
// }

export function Resolver (Inputs, props) {
	const msg = "Resolver cannot parse Input Field";

	let structure = {};
	for(var i in Inputs) {
		let field = Inputs[i];
		let value = props[i] || field.defaultValue;
		if(field.resolve(value)){
			structure[i] = value;
		} else {
			console.log(`Field ${i} failed to resolve to ${field.getType()}`);
		}
	}
	return structure;
}