/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/

"use strict";

class BasicEvaluatedExpression {

	constructor() {
		this.range = null;
	}

	isNull() {
		return !!this.null;
	}

	isString() {
		return Object.prototype.hasOwnProperty.call(this, "string");
	}

	isNumber() {
		return Object.prototype.hasOwnProperty.call(this, "number");
	}

	isBoolean() {
		return Object.prototype.hasOwnProperty.call(this, "bool");
	}

	isRegExp() {
		return Object.prototype.hasOwnProperty.call(this, "regExp");
	}

	isConditional() {
		return Object.prototype.hasOwnProperty.call(this, "options");
	}

	isArray() {
		return Object.prototype.hasOwnProperty.call(this, "items");
	}

	isConstArray() {
		return Object.prototype.hasOwnProperty.call(this, "array");
	}

	isIdentifier() {
		return Object.prototype.hasOwnProperty.call(this, "identifier");
	}

	isWrapped() {
		return Object.prototype.hasOwnProperty.call(this, "prefix") || Object.prototype.hasOwnProperty.call(this, "postfix");
	}

	isTemplateString() {
		return Object.prototype.hasOwnProperty.call(this, "quasis");
	}

	isTruthy() {
		return this.truthy;
	}

	isFalsy() {
		return this.falsy;
	}

	asBool() {
		if(this.truthy) return true;
		else if(this.falsy) return false;
		else if(this.isBoolean()) return this.bool;
		else if(this.isNull()) return false;
		else if(this.isString()) return !!this.string;
		else if(this.isNumber()) return !!this.number;
		else if(this.isRegExp()) return true;
		else if(this.isArray()) return true;
		else if(this.isConstArray()) return true;
		else if(this.isWrapped()) return this.prefix && this.prefix.asBool() || this.postfix && this.postfix.asBool() ? true : undefined;
		else if(this.isTemplateString()) {
			if(this.quasis.length === 1) return this.quasis[0].asBool();
			for(let i = 0; i < this.quasis.length; i++) {
				if(this.quasis[i].asBool()) return true;
			}
			// can't tell if string will be empty without executing
		}
		return undefined;
	}

	setString(str) {
		if(str === null)
			delete this.string;
		else
			this.string = str;
		return this;
	}

	setNull() {
		this.null = true;
		return this;
	}

	setNumber(num) {
		if(num === null)
			delete this.number;
		else
			this.number = num;
		return this;
	}

	setBoolean(bool) {
		if(bool === null)
			delete this.bool;
		else
			this.bool = bool;
		return this;
	}

	setRegExp(regExp) {
		if(regExp === null)
			delete this.regExp;
		else
			this.regExp = regExp;
		return this;
	}

	setIdentifier(identifier) {
		if(identifier === null)
			delete this.identifier;
		else
			this.identifier = identifier;
		return this;
	}

	setWrapped(prefix, postfix) {
		this.prefix = prefix;
		this.postfix = postfix;
		return this;
	}

	unsetWrapped() {
		delete this.prefix;
		delete this.postfix;
		return this;
	}

	setOptions(options) {
		if(options === null)
			delete this.options;
		else
			this.options = options;
		return this;
	}

	setItems(items) {
		if(items === null)
			delete this.items;
		else
			this.items = items;
		return this;
	}

	setArray(array) {
		if(array === null)
			delete this.array;
		else
			this.array = array;
		return this;
	}

	setTemplateString(quasis) {
		if(quasis === null)
			delete this.quasis;
		else
			this.quasis = quasis;
		return this;
	}

	setTruthy() {
		this.falsy = false;
		this.truthy = true;
		return this;
	}

	setFalsy() {
		this.falsy = true;
		this.truthy = false;
		return this;
	}

	addOptions(options) {
		if(!this.options) this.options = [];
		options.forEach(item => {
			this.options.push(item);
		}, this);
		return this;
	}

	setRange(range) {
		this.range = range;
		return this;
	}

}

module.exports = BasicEvaluatedExpression;
