/********************************************************************************
 * 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.freetextindexer.entities;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.Value;

/**
 * MDMEntity (Entity for a business object (contains a list of
 * {@link MDMAttribute}s)
 * 
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 *
 */
public class MDMEntity {

	private static final Set<String> NOTINDEXED = new HashSet<>(
			Arrays.asList(BaseEntity.ATTR_ID, BaseEntity.ATTR_MIMETYPE, "Optional", "SortIndex"));

	/** name of the MDM business object */
	public final String name;

	/** type of the MDM business object */
	public final String type;

	/** id of the MDM business object */
	public final String id;

	/** list of attribute to transfer */
	public final Map<String, String> attributes;

	public final List<MDMEntity> components = new ArrayList<>();

	/**
	 * Constructor
	 * 
	 * @param name   name of the MDM business object
	 * @param type   type as String of the MDM business object (e.g. TestStep)
	 * @param uri    URI of an MDM business object
	 * @param values values of a MDM business object
	 */
	public MDMEntity(String name, String type, String id, Map<String, Value> values) {
		this.name = name;
		this.type = type;
		this.id = id;

		this.attributes = initAttributes(values);
	}

	/**
	 * converts the MDM business object values to string values
	 * 
	 * @param values values of a MDM business object
	 * @return list with converted attribute values
	 */
	private Map<String, String> initAttributes(Map<String, Value> values) {
		Map<String, String> mapAttrs = new HashMap<>();
		for (java.util.Map.Entry<String, Value> entry : values.entrySet()) {

			String key = entry.getKey();
			if (!NOTINDEXED.contains(key) && entry.getValue().isValid()) {
				mapAttrs.put(key, entry.getValue().extract().toString());
			}
		}

		return mapAttrs;
	}

}
