/********************************************************************************
 * Copyright (c) 2015-2018 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.businessobjects.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;

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

import org.eclipse.mdm.api.atfxadapter.ATFXContextFactory;
import org.eclipse.mdm.api.base.model.ContextRoot;
import org.eclipse.mdm.api.base.model.Unit;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.model.EntityFactory;
import org.eclipse.mdm.api.dflt.model.Pool;
import org.eclipse.mdm.businessobjects.entity.MDMEntity;
import org.junit.BeforeClass;
import org.junit.Test;

import io.vavr.collection.List;
import io.vavr.control.Try;

public class EntityServiceTest {

	private static EntityFactory entityFactory;

	@BeforeClass
	public static void init() {
		Map<String, String> map = io.vavr.collection.HashMap
				.of("atfxfile", "src/test/resources/mdm_complete_application_model_500.xml", //
						"freetext.active", "false", //
						"entityConfigRepositoryLoaderClass",
						"org.eclipse.mdm.api.odsadapter.lookup.config.DefaultEntityConfigRepositoryLoader") //
				.toJavaMap();

		try {
			ApplicationContext context = new ATFXContextFactory().connect(map);
			entityFactory = context.getEntityFactory().get();
		} catch (Exception e1) {
			fail("ATFXContextFactory could not be initialized");
		}
	}

	@Test
	public void testSatisfiesParameters() throws Exception {
		EntityService entityService = new EntityService();

		Class<?>[] parameter = new Class[] { java.util.List.class, ContextRoot.class };
		List<Class<?>> required = List.of(ArrayList.class, ContextRoot.class);

		assertThat(entityService.satisfiesParameters(parameter, required)).isTrue();
	}

	@Test
	public void testSatisfiesParametersNotSubClassSuperClass() throws Exception {
		EntityService entityService = new EntityService();

		Class<?>[] parameter = new Class[] { ArrayList.class, ContextRoot.class };
		List<Class<?>> required = List.of(java.util.List.class, ContextRoot.class);

		assertThat(entityService.satisfiesParameters(parameter, required)).isFalse();
	}

	@Test
	public void testSatisfiesParametersNot() throws Exception {
		EntityService entityService = new EntityService();

		Class<?>[] parameter = new Class[] { HashMap.class, ContextRoot.class };
		List<Class<? extends Object>> required = List.of(java.util.List.class, ContextRoot.class);

		assertThat(entityService.satisfiesParameters(parameter, required)).isFalse();
	}

	@Test
	public void testSatisfiesParametersAutoBoxing() throws Exception {
		EntityService entityService = new EntityService();

		Class<?>[] parameter = new Class[] { boolean.class, ContextRoot.class };
		List<Class<?>> required = List.of(Boolean.class, ContextRoot.class);

		assertThat(entityService.satisfiesParameters(parameter, required)).isTrue();
	}

	@Test
	public void testSatisfiesParametersAutoUnboxing() throws Exception {
		EntityService entityService = new EntityService();

		Class<?>[] parameter = new Class[] { Boolean.class, ContextRoot.class };
		List<Class<?>> required = List.of(boolean.class, ContextRoot.class);

		assertThat(entityService.satisfiesParameters(parameter, required)).isTrue();
	}

	@Test
	public void testSatisfiesParametersNotLength() throws Exception {
		EntityService entityService = new EntityService();

		Class<?>[] parameter = new Class[] { Boolean.class, ContextRoot.class, boolean.class };
		List<Class<?>> required = List.of(boolean.class, ContextRoot.class);

		assertThat(entityService.satisfiesParameters(parameter, required)).isFalse();
	}

	@Test
	public void testSatisfiesParametersWithNonMatchingArgumentCountShouldReturnFalse() {
		EntityService entityService = new EntityService();

		assertThat(entityService.satisfiesParameters(new Class[] { String.class },
				io.vavr.collection.List.of(String.class, Pool.class))).isFalse();
	}

	@Test
	public void updateEntityWithEmptyNumberAttributeShouldReturnFailureWithNumberFormatException() {
		Unit unit = entityFactory.createUnit("testUnit", entityFactory.createPhysicalDimension("testPhysDim"));
		EntityService es = new EntityService();
		Try<?> t = es.updateEntity(unit, new MDMEntity(unit));
		assertThat(t.getCause().getCause()).isInstanceOf(NumberFormatException.class);
	}
}
