/********************************************************************************
 * 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.odsadapter.lookup.config;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

import org.eclipse.mdm.api.base.adapter.EntityType;
import org.eclipse.mdm.api.base.model.ContextType;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.model.StatusAttachable;

/**
 * Describes the composition of an {@link Entity} with its mandatory, optional
 * and child relations.
 *
 * @param <T> The entity type.
 * @since 1.0.0
 * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
 */
public class EntityConfig<T extends Entity> {

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

	private final List<EntityConfig<? extends Deletable>> childConfigs = new ArrayList<>();

	private final List<EntityConfig<?>> inheritedConfigs = new ArrayList<>();
	private final List<EntityConfig<?>> mandatoryConfigs = new ArrayList<>();
	private final List<EntityConfig<?>> optionalConfigs = new ArrayList<>();

	private Comparator<? super T> comparator = Entity.COMPARATOR;

	private final Key<T> key;

	private EntityType entityType;

	private boolean reflexive;
	private String mimeType;

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

	/**
	 * Constructor.
	 *
	 * @param key The {@link Key} this entity config is bound to.
	 */
	public EntityConfig(Key<T> key) {
		this.key = key;
	}

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

	/**
	 * Returns the {@link Key} this entity config is bound to.
	 *
	 * @return The {@code Key} is returned.
	 */
	public Key<T> getKey() {
		return key;
	}

	/**
	 * Returns the {@link Entity} class.
	 *
	 * @return The {@code Entity} class is returned.
	 */
	public Class<T> getEntityClass() {
		return key.entityClass;
	}

	/**
	 * Returns the {@link StatusAttachable} class.
	 *
	 * @return Optional is empty if {@code StatusAttachable} is undefined.
	 */
	public Optional<Class<? extends StatusAttachable>> getStatusAttachableClass() {
		return Optional.ofNullable(key.statusAttachableClass);
	}

	/**
	 * Returns the {@link ContextType}.
	 *
	 * @return Optional is empty {@code ContextType} is undefined.
	 */
	public Optional<ContextType> getContextType() {
		return Optional.ofNullable(key.contextType);
	}

	/**
	 * Returns the {@link Comparator} for {@link Entity}s associated with this
	 * entity config.
	 *
	 * @return The {@code Comparator} is returned.
	 */
	public Comparator<? super T> getComparator() {
		return comparator;
	}

	/**
	 * Returns the {@link EntityType} of this entity config.
	 *
	 * @return The {@code EntityType} is returned.
	 */
	public EntityType getEntityType() {
		return entityType;
	}

	/**
	 * Returns the default MIME type for a newly created {@link Entity} associated
	 * with this entity config.
	 *
	 * @return The default MIME type is returned.
	 */
	public String getMimeType() {
		return mimeType;
	}

	/**
	 * Returns all related child configs.
	 *
	 * @return The returned {@code List} is unmodifiable.
	 */
	public List<EntityConfig<? extends Deletable>> getChildConfigs() {
		return Collections.unmodifiableList(childConfigs);
	}

	/**
	 * Returns all related inherited configs.
	 *
	 * @return The returned {@code List} is unmodifiable.
	 */
	public List<EntityConfig<?>> getInheritedConfigs() {
		return Collections.unmodifiableList(inheritedConfigs);
	}

	/**
	 * Returns all related mandatory configs.
	 *
	 * @return The returned {@code List} is unmodifiable.
	 */
	public List<EntityConfig<?>> getMandatoryConfigs() {
		return Collections.unmodifiableList(mandatoryConfigs);
	}

	/**
	 * Returns all related optional configs.
	 *
	 * @return The returned {@code List} is unmodifiable.
	 */
	public List<EntityConfig<?>> getOptionalConfigs() {
		return Collections.unmodifiableList(optionalConfigs);
	}

	/**
	 * Checks whether {@link Entity}s associated with this entity config may have
	 * children of the same type.
	 *
	 * @return Returns {@code true} if this entity config is reflexive.
	 */
	public boolean isReflexive() {
		return reflexive;
	}

	/**
	 * Sets a new {@link Comparator} for this entity config.
	 *
	 * @param comparator The new {@code Comparator}.
	 */
	public void setComparator(Comparator<? super T> comparator) {
		this.comparator = comparator;
	}

	/**
	 * Sets the {@link EntityType} for this entity config.
	 *
	 * @param entityType The {@code EntityType}.
	 * @throws IllegalStateException Thrown if {@link EntityType} is already
	 *                               defined.
	 */
	public void setEntityType(EntityType entityType) {
		if (this.entityType != null) {
			throw new IllegalStateException("It is not allowed to override the entity type.");
		}

		this.entityType = entityType;
	}

	/**
	 * Sets the default MIME type for newly created {@link Entity}s associated with
	 * this entity config.
	 *
	 * @param mimeType The default MIME type.
	 * @throws IllegalStateException Thrown if default MIME type is already defined.
	 */
	public void setMimeType(String mimeType) {
		if (this.mimeType != null && !this.mimeType.isEmpty()) {
			throw new IllegalStateException("It is not allowed to override the default MIME type.");
		}

		this.mimeType = mimeType;
	}

	/**
	 * Adds a related inherited {@link EntityConfig}.
	 *
	 * @param entityConfig The {@code EntityConfig}.
	 */
	public void addInherited(EntityConfig<?> entityConfig) {
		inheritedConfigs.add(entityConfig);
	}

	/**
	 * Adds a related mandatory {@link EntityConfig}.
	 *
	 * @param entityConfig The {@code EntityConfig}.
	 */
	public void addMandatory(EntityConfig<?> entityConfig) {
		mandatoryConfigs.add(entityConfig);
	}

	/**
	 * Adds a related optional {@link EntityConfig}.
	 *
	 * @param entityConfig The {@code EntityConfig}.
	 */
	public void addOptional(EntityConfig<?> entityConfig) {
		optionalConfigs.add(entityConfig);
	}

	/**
	 * Adds a related child {@link EntityConfig}.
	 *
	 * @param childConfig The {@code EntityConfig}.
	 */
	public void addChild(EntityConfig<? extends Deletable> childConfig) {
		if (this == childConfig) {
			reflexive = true;
		} else {
			childConfigs.add(childConfig);
		}
	}

	// ======================================================================
	// Inner classes
	// ======================================================================

	/**
	 * Used as an identifier for {@link EntityConfig}s.
	 *
	 * @param <T> The entity type.
	 */
	public static final class Key<T extends Entity> {

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

		final Class<? extends StatusAttachable> statusAttachableClass;
		final Class<T> entityClass;
		final ContextType contextType;

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

		/**
		 * Constructor.
		 *
		 * @param entityClass The {@link Entity} class.
		 */
		public Key(Class<T> entityClass) {
			this.entityClass = entityClass;
			statusAttachableClass = null;
			contextType = null;
		}

		/**
		 * Constructor.
		 *
		 * @param entityClass           The {@link Entity} class.
		 * @param statusAttachableClass The {@link StatusAttachable} class.
		 */
		public Key(Class<T> entityClass, Class<? extends StatusAttachable> statusAttachableClass) {
			this.statusAttachableClass = statusAttachableClass;
			this.entityClass = entityClass;
			contextType = null;
		}

		/**
		 * Constructor.
		 *
		 * @param entityClass The {@link Entity} class.
		 * @param contextType The {@link ContextType}.
		 */
		public Key(Class<T> entityClass, ContextType contextType) {
			this.entityClass = entityClass;
			this.contextType = contextType;
			statusAttachableClass = null;
		}

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

		/**
		 * {@inheritDoc}
		 */
		@Override
		public int hashCode() {
			return Objects.hash(entityClass, statusAttachableClass, contextType);
		}

		/**
		 * {@inheritDoc}
		 */
		@Override
		public boolean equals(Object object) {
			// reference check (this == object) omitted
			if (object instanceof Key) {
				Key<?> other = (Key<?>) object;
				return Objects.equals(entityClass, other.entityClass)
						&& Objects.equals(statusAttachableClass, other.statusAttachableClass)
						&& Objects.equals(contextType, other.contextType);
			}

			return false;
		}

		/**
		 * {@inheritDoc}
		 */
		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder(entityClass.getSimpleName());

			if (statusAttachableClass != null) {
				sb.append('_').append(statusAttachableClass.getSimpleName());
			}

			if (contextType != null) {
				sb.append('_').append(contextType);
			}

			return sb.toString();
		}

	}

}
