/********************************************************************************
 * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.api.base.massdata;

import java.lang.reflect.Array;

import org.eclipse.mdm.api.base.model.ScalarType;

/**
 * This is a base values builder provides methods for configuring values.
 *
 * @since 1.0.0
 * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 */
abstract class BaseValuesBuilder {

	// ======================================================================
	// Instance variables
	// ======================================================================

	private final WriteRequest writeRequest;

	// ======================================================================
	// Constructors
	// ======================================================================

	/**
	 * Constructor.
	 *
	 * @param writeRequest The {@link WriteRequest} given values and corresponding
	 *                     {@link ScalarType} will be applied to.
	 */
	BaseValuesBuilder(WriteRequest writeRequest) {
		this.writeRequest = writeRequest;
	}

	// ======================================================================
	// Protected methods
	// ======================================================================

	/**
	 * Adds given value sequence and sets the corresponding {@link ScalarType} as
	 * the raw {@code ScalarType}.
	 *
	 * @param scalarType The {@code ScalarType}.
	 * @param values     The array value sequence must be assignment compatible with
	 *                   the type represented by the given {@code ScalarType}.
	 */
	protected final void createValues(ScalarType scalarType, Object values) {
		if (values == null) {
			throw new IllegalArgumentException("Values is not allowed to be null.");
		}

		getWriteRequest().setRawScalarType(scalarType);
		getWriteRequest().setValues(values);
	}

	/**
	 * Adds given value sequence, associated validity flags and sets the
	 * corresponding {@link ScalarType} as the raw {@code ScalarType}.
	 *
	 * @param scalarType The {@code ScalarType}.
	 * @param values     The array value sequence must be assignment compatible with
	 *                   the type represented by the given {@code ScalarType}.
	 * @param flags      The validity flags for each value in the values sequence.
	 */
	protected final void createValues(ScalarType scalarType, Object values, boolean[] flags) {
		if (values == null || flags == null) {
			throw new IllegalArgumentException("Neither values nor flags are allowed to be null.");
		} else if (Array.getLength(values) != flags.length) {
			throw new IllegalArgumentException("Length of values and flags must be equal.");
		}

		getWriteRequest().setRawScalarType(scalarType);
		getWriteRequest().setValues(values, flags);
	}

	/**
	 * Returns the {@link WriteRequest}.
	 *
	 * @return The {@code WriteRequest} is returned.
	 */
	protected final WriteRequest getWriteRequest() {
		return writeRequest;
	}

}
