package org.eclipse.mdm.api.odsadapter.lookup;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.query.EntityType;
import org.eclipse.mdm.api.base.query.Record;
import org.eclipse.mdm.api.base.query.Relation;
import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig;

/**
 * Utility class to collect {@link EntityRecord} referencing entities of the
 * same type specified by an instance of this class.
 *
 * @since 1.0.0
 * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
 */
public final class RelationConfig {

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

	final Map<String, List<EntityRecord<?>>> dependants = new HashMap<>();
	final EntityConfig<?> entityConfig;
	final Relation relation;
	final boolean mandatory;

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

	/**
	 * Constructor.
	 *
	 * @param source
	 *            The source {@link EntityType}.
	 * @param entityConfig
	 *            The target {@link EntityConfig}.
	 * @param mandatory
	 *            Flag indicates whether a related must exist or not.
	 */
	public RelationConfig(EntityType source, EntityConfig<?> entityConfig, boolean mandatory) {
		this.entityConfig = entityConfig;
		relation = source.getRelation(entityConfig.getEntityType());
		this.mandatory = mandatory;
	}

	// ======================================================================
	// Public methods
	// ======================================================================

	/**
	 * Given {@link EntityRecord} depends on {@link Entity}s which are loaded by
	 * processing this relation config. Therefore given {@code EntityRecord}
	 * cached and satisfied as soon as the corresponding entities are loaded.
	 *
	 * @param entityRecord
	 *            The dependant {@code EntityRecord}.
	 * @param record
	 *            The {@link Record} associated with given {@link EntityRecord}.
	 */
	public void add(EntityRecord<?> entityRecord, Record record) {
		Optional<String> relatedEntityID = record.getID(relation);
		if (relatedEntityID.isPresent()) {
			dependants.computeIfAbsent(relatedEntityID.get(), k -> new ArrayList<>()).add(entityRecord);
		} else if (mandatory) {
			throw new IllegalStateException("Mandatory relation unsatisfied.");
		}
	}

}
