/********************************************************************************
 * 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.boundary;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

import java.util.Arrays;
import java.util.Optional;

import org.eclipse.mdm.api.base.adapter.Attribute;
import org.eclipse.mdm.api.base.adapter.EntityType;
import org.eclipse.mdm.api.base.adapter.ModelManager;
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.Pool;
import org.eclipse.mdm.api.dflt.model.Project;
import org.eclipse.mdm.businessobjects.control.I18NActivity;
import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
import org.eclipse.mdm.businessobjects.control.NavigationActivity;
import org.eclipse.mdm.businessobjects.control.SearchActivity;
import org.eclipse.mdm.connector.boundary.ConnectorService;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

public class PoolServiceTest {

	ApplicationContext context = Mockito.mock(ApplicationContext.class);
	EntityManager em = Mockito.mock(EntityManager.class);
	ModelManager mm = mockModelManager();
	ConnectorService connectorService = Mockito.mock(ConnectorService.class);
	SearchActivity searchActivity = Mockito.mock(SearchActivity.class);
	NavigationActivity navigationActivity = Mockito.mock(NavigationActivity.class);
	I18NActivity i18nActivity = Mockito.mock(I18NActivity.class);

	PoolService service = new PoolService(connectorService, searchActivity, navigationActivity, i18nActivity);

	@Before
	public void init() {
		when(connectorService.getContextByName("MDMTEST")).thenReturn(context);
		when(context.getEntityManager()).thenReturn(Optional.of(em));
		when(context.getModelManager()).thenReturn(Optional.of(mm));
	}

	@Test
	public void testGetPool() throws DataAccessException {
		service.getPool("MDMTEST", "1");

		verify(em).load(Pool.class, "1");
		verifyNoMoreInteractions(searchActivity);
	}

	@Test
	public void testGetPoolsEmptyFilter() throws DataAccessException {
		service.getPools("MDMTEST", "");

		verify(em).loadAll(Mockito.any());
		verifyNoMoreInteractions(searchActivity);
	}

	@Test
	public void testGetPoolsNullFilter() throws DataAccessException {
		service.getPools("MDMTEST", null);

		verify(em).loadAll(Mockito.any());
		verifyNoMoreInteractions(searchActivity);
	}

	@Test(expected = MDMEntityAccessException.class)
	public void testGetPoolsWrongEnvironment() {
		doThrow(MDMEntityAccessException.class).when(connectorService).getContextByName("wrongEnvironment");

		service.getPools("wrongEnvironment", "Pool.Name eq 'crash'");
	}

	@Test
	public void testGetPoolsParentFilter() {
		service.getPools("MDMTEST", "Project.Id eq '4711'");

		verify(navigationActivity).getPools("MDMTEST", "4711");
		verifyZeroInteractions(searchActivity);
	}

	@Test
	public void testGetPoolsNoParentFilter() {
		service.getPools("MDMTEST", "Project.Id eq '4711' or Project.Name eq 'Project A'");

		verify(searchActivity).search(context, Pool.class, "Project.Id eq '4711' or Project.Name eq 'Project A'");
		verifyZeroInteractions(navigationActivity);
	}

	@Test
	public void testGetPools() {
		service.getPools("MDMTEST", "Pool.Name eq 'crash'");

		verify(searchActivity).search(context, Pool.class, "Pool.Name eq 'crash'");
	}

	@Test
	public void testGetSearchAttributes() {
		service.getSearchAttributes("MDMTEST");

		verify(searchActivity).listAvailableAttributes(context, Pool.class);
	}

	@Test
	public void testLocalizeAttributes() {
		service.localizeAttributes("MDMTEST");
		verify(i18nActivity).localizeAttributes("MDMTEST", Pool.class);
	}

	@Test
	public void testLocalizeType() {
		service.localizeType("MDMTEST");
		verify(i18nActivity).localizeType("MDMTEST", Pool.class);
	}

	private ModelManager mockModelManager() {

		Attribute projectId = mock(Attribute.class);
		when(projectId.getName()).thenReturn("Id");
		when(projectId.getValueType()).thenReturn(ValueType.STRING);
		when(projectId.createValue(any(), any())).thenCallRealMethod();
		when(projectId.createValue(any(), anyBoolean(), any())).thenCallRealMethod();

		Attribute projectName = mock(Attribute.class);
		when(projectName.getName()).thenReturn("Name");
		when(projectName.getValueType()).thenReturn(ValueType.STRING);
		when(projectName.createValue(any(), any())).thenCallRealMethod();
		when(projectName.createValue(any(), anyBoolean(), any())).thenCallRealMethod();

		EntityType project = mock(EntityType.class);
		when(project.getSourceName()).thenReturn("MDMTEST");
		when(project.getName()).thenReturn("Project");
		when(project.getAttributes()).thenReturn(Arrays.asList(projectId));
		when(project.getAttribute("Id")).thenReturn(projectId);
		when(project.getIDAttribute()).thenReturn(projectId);
		when(project.getAttribute("Name")).thenReturn(projectName);
		when(project.getNameAttribute()).thenReturn(projectName);

		Attribute poolId = mock(Attribute.class);
		when(poolId.getName()).thenReturn("Id");
		when(poolId.getValueType()).thenReturn(ValueType.LONG);

		Attribute poolName = mock(Attribute.class);
		when(poolName.getName()).thenReturn("Name");
		when(poolName.getValueType()).thenReturn(ValueType.STRING);

		EntityType pool = mock(EntityType.class);
		when(pool.getSourceName()).thenReturn("MDMTEST");
		when(pool.getName()).thenReturn("Pool");
		when(pool.getAttributes()).thenReturn(Arrays.asList(poolId, poolName));
		when(pool.getAttribute("Name")).thenReturn(poolName);
		when(pool.getIDAttribute()).thenReturn(poolId);

		when(poolId.getEntityType()).thenReturn(pool);
		when(poolName.getEntityType()).thenReturn(pool);

		ModelManager mmgr = mock(ModelManager.class);
		when(mmgr.listEntityTypes()).thenReturn(Arrays.asList(project, pool));
		when(mmgr.getEntityType(Project.class)).thenReturn(project);
		when(mmgr.getEntityType("Project")).thenReturn(project);
		when(mmgr.getEntityType(Pool.class)).thenReturn(pool);
		when(mmgr.getEntityType("Pool")).thenReturn(pool);

		return mmgr;
	}
}
