"use strict";

const either = require("@validatem/either");
const arrayOf = require("@validatem/array-of");

const tagAsType = require("../tag-as-type");

module.exports = function (operations) {
	const isObjectType = require("./is-object-type")(operations);
	const isExpressionList = require("./is-expression-list")(operations);
	const isConditionList = require("./is-condition-list")(operations);
	const isWhereObjectList = require("./is-where-object-list")(operations);
	const isConditionValue = require("./is-condition-value")(operations);
	
	return either([
		// Boolean AND/OR
		[ isExpressionList, tagAsType("expressions") ],
		// Combine (JOIN)
		// FIXME?
		// ...
		// Value-expression-only conditions (eg. `moreThan(anyOf(...))`)
		[ either([
			arrayOf(isConditionValue),
			isObjectType("placeholder"), // for dynamically specified array of values
			isObjectType("sqlExpression"), // FIXME: Verify that this should be treated as a value, not an expression
		]), tagAsType("values") ],
		// Multiple-choice conditions
		[ isWhereObjectList, tagAsType("expressions") ],
		[ isConditionList, tagAsType("conditions") ],
	]);
};
