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

import static org.assertj.core.api.Assertions.assertThat;

import java.util.List;
import java.util.Map;

import org.assertj.core.api.Assertions;
import org.eclipse.mdm.api.base.ConnectionException;
import org.eclipse.mdm.api.base.massdata.ReadRequest;
import org.eclipse.mdm.api.base.model.Channel;
import org.eclipse.mdm.api.base.model.ChannelGroup;
import org.eclipse.mdm.api.base.model.ContextRoot;
import org.eclipse.mdm.api.base.model.ContextType;
import org.eclipse.mdm.api.base.model.MeasuredValues;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.Test;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.model.ValueType;
import org.eclipse.mdm.api.base.query.DataAccessException;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.api.dflt.model.Project;
import org.junit.AfterClass;
import org.junit.BeforeClass;

import com.google.common.collect.ImmutableMap;

public class AtfxAdapterTest {

	public static final String ATFX_FILE = "src/test/resources/Right_Acc.atfx";

	public static ApplicationContext context;

	@BeforeClass
	public static void init() throws ConnectionException {
		Map<String, String> map = ImmutableMap.of("atfxfile", ATFX_FILE, "freetext.active", "false");

		context = new ATFXContextFactory().connect(map);
	}

	@AfterClass
	public static void teardown() throws ConnectionException {
		context.close();
	}

	@org.junit.Test
	public void testLoadLoggedOnUser() {
		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadLoggedOnUser()).isNotNull();
		;
	}

	@org.junit.Test
	public void testLoadEnvironment() {
		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadEnvironment().getName()).isEqualTo("MDM");
	}

	@org.junit.Test
	public void testLoadAllProjects() {

		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadAll(Project.class)).extracting(Project::getName).contains("PMV Model P");
	}

	@org.junit.Test
	public void testLoadAllTests() {

		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadAll(Test.class)).extracting(Test::getName).contains("PBN_UNECE_R51_20140314170907");
	}

	@org.junit.Test
	public void testLoadAllTestSteps() {

		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadAll(TestStep.class)).extracting(TestStep::getName).contains("PBN_UNECE_R51_Right_Acc_70");
	}

	@org.junit.Test
	public void testLoadAllMeasurements() {

		EntityManager em = context.getEntityManager().get();
		assertThat(em.loadAll(Measurement.class)).extracting(Measurement::getName).contains("Channel");
	}

	@org.junit.Test
	public void testLoadParent() {

		EntityManager em = context.getEntityManager().get();
		Measurement meaResult = em.loadAll(Measurement.class).get(0);

		assertThat(em.loadParent(meaResult, TestStep.class).get()).extracting(TestStep::getName)
				.contains("PBN_UNECE_R51_Right_Acc_70");
	}

	@org.junit.Test
	public void testLoadChildren() {

		EntityManager em = context.getEntityManager().get();
		Test test = em.loadAll(Test.class).get(0);

		assertThat(em.loadChildren(test, TestStep.class).get(0)).extracting(TestStep::getName)
				.contains("PBN_UNECE_R51_Right_Acc_70");
	}

	@org.junit.Test
	public void testLoadChildrenForChannelGroup() {

		EntityManager em = context.getEntityManager().get();
		ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);

		assertThat(em.loadChildren(channelGroup, Channel.class)).extracting(Channel::getName).contains("X-Axis",
				"CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08",
				"CHANNEL09", "CHANNEL10");
	}

	@org.junit.Test
	public void testLoadChildrenForChannelGroupWithPattern() {

		EntityManager em = context.getEntityManager().get();
		ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);

		Assertions.assertThatThrownBy(() -> em.loadChildren(channelGroup, Channel.class, "*Axis"))
				.isInstanceOf(DataAccessException.class).hasMessageContaining("not supported");

		// assertThat(em.loadChildren(channelGroup, Channel.class,
		// "*Axis")).extracting(Channel::getName)
		// .contains("X-Axis", "CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04",
		// "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09",
		// "CHANNEL10");
	}

	@org.junit.Test
	public void testLoadParentForChannel() {

		EntityManager em = context.getEntityManager().get();
		Channel channel = em.loadAll(Channel.class).get(0);

		assertThat(em.loadParent(channel, ChannelGroup.class).get()).extracting(ChannelGroup::getName)
				.contains("Channel");
	}

	@org.junit.Test
	public void testLoadAllChannelGroups() {

		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadAll(ChannelGroup.class)).extracting(ChannelGroup::getName).contains("Channel");
	}

	@org.junit.Test
	public void testLoadAllChannels() {

		EntityManager em = context.getEntityManager().get();

		assertThat(em.loadAll(Channel.class)).extracting(Channel::getName).contains("X-Axis", "CHANNEL01", "CHANNEL02",
				"CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09", "CHANNEL10");
	}

	@org.junit.Test
	public void testLoadAllContext() {

		EntityManager em = context.getEntityManager().get();

		List<Measurement> measurements = em.loadAll(Measurement.class);
		assertThat(measurements).hasSize(1);

		Map<ContextType, ContextRoot> context = em.loadContexts(measurements.get(0));
		assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents()).extracting(cc -> cc.getName())
				.contains("FL_tyre");

		assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents().get(0).getValues()).hasSize(7)
				.containsEntry("Name", ValueType.STRING.create("Name", "FL_tyre"))
				.containsEntry("axle", ValueType.SHORT.create("axle", (short) 1))
				.containsEntry("side", ValueType.STRING.create("side", "Left"))
				.containsEntry("manufacturer", ValueType.STRING.create("manufacturer", "Tunnelsand"));

	}

	@org.junit.Test
	public void testReadMeasuredValues() {
		EntityManager em = context.getEntityManager().get();

		List<ChannelGroup> listCg = em.loadAll(ChannelGroup.class);
		assertThat(listCg).hasSize(1);

		List<MeasuredValues> values = em
				.readMeasuredValues(ReadRequest.create(listCg.get(0)).allChannels().allValues());
		assertThat(values).extracting(mv -> mv.getLength()).containsOnly(3001);
	}
}
