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

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.Mockito.when;

import java.io.InputStream;
import java.io.StringReader;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Optional;

import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.UriBuilder;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.assertj.core.groups.Tuple;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.TestStep;
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.connector.boundary.ConnectorService;
import org.eclipse.mdm.shoppingbasket.entity.MDMItem;
import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasket;
import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasketRequest;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import com.google.common.collect.ImmutableMap;

public class ShoppingBasketResourceTest extends JerseyTest {

	private static ApplicationContext context = Mockito.mock(ApplicationContext.class);
	private static EntityManager em = Mockito.mock(EntityManager.class);
	private static ConnectorService connectorService = Mockito.mock(ConnectorService.class);

	private static TestStep testStep = Mockito.mock(TestStep.class);
	private static Measurement measurement = Mockito.mock(Measurement.class);

	public static class ConnectorServiceFactory implements Factory<ConnectorService> {
		@Override
		public void dispose(ConnectorService connectorService) {
			// nothing to do here
		}

		@Override
		public ConnectorService provide() {
			return connectorService;
		}
	}

	@Override
	public Application configure() {
		ResourceConfig config = new ResourceConfig();

		config.register(new AbstractBinder() {
			@Override
			protected void configure() {
				bindFactory(ConnectorServiceFactory.class).to(ConnectorService.class);
			}
		});

		config.register(ShoppingBasketResource.class);
		config.register(JacksonFeature.class);
		return config;
	}

	@Before
	public void init() {

		when(testStep.getSourceName()).thenReturn("MDMTEST");
		when(testStep.getTypeName()).thenReturn("TestStep");
		when(testStep.getID()).thenReturn("1");

		when(measurement.getSourceName()).thenReturn("MDMTEST");
		when(measurement.getTypeName()).thenReturn("Measurement");
		when(measurement.getID()).thenReturn("2");

		when(connectorService.getContextByName("MDMTEST")).thenReturn(context);
		when(context.getEntityManager()).thenReturn(Optional.of(em));
		when(em.load(TestStep.class, "1")).thenReturn(testStep);
		when(context.getAdapterType()).thenReturn("ods");
		when(em.getLinks(Mockito.anyList())).thenReturn(ImmutableMap.of(testStep, "servicename/asampath"));
	}

	@Test
	public void testEmptyShoppingBasketRequest() {
		ShoppingBasketRequest request = new ShoppingBasketRequest();

		ShoppingBasket basket = target("shoppingbasket").request().post(Entity.json(request), ShoppingBasket.class);
		assertThat(basket.getItems()).isEmpty();
	}

	@Test
	public void testShoppingBasket() throws DataAccessException, URISyntaxException {
		when(em.getLinks(Mockito.anyList())).thenReturn(ImmutableMap.of(testStep, "servicename/asampath/testStep",
				measurement, "servicename/asampath/measurement"));

		ShoppingBasket basket = target("shoppingbasket").request().post(Entity.json(getShoppingBasketRequest()),
				ShoppingBasket.class);

		assertThat(basket.getName()).isEqualTo("my shopping basket (<äöüß\\/>)");
		assertThat(basket.getItems()).extracting(i -> Tuple.tuple(i.getSource(), i.getLink(), i.getRestURI()))
				.containsExactly(
						Tuple.tuple("ods", "servicename/asampath/testStep",
								UriBuilder.fromUri(this.getBaseUri()).path("/environments/MDMTEST/teststeps/1")
										.build()),
						Tuple.tuple("ods", "servicename/asampath/measurement", UriBuilder.fromUri(this.getBaseUri())
								.path("/environments/MDMTEST/measurements/2").build()));
	}

	@Test
	public void testValidateShoppingBasketXml() {
		String xml = target("shoppingbasket").request().post(Entity.json(getShoppingBasketRequest()), String.class);
		validateAgainstXSD(xml, ShoppingBasketResourceTest.class.getResourceAsStream("/shoppingbasket1.0.xsd"));
		System.out.println(xml);
	}

	private ShoppingBasketRequest getShoppingBasketRequest() {
		MDMItem item1 = new MDMItem();
		item1.setSource("MDMTEST");
		item1.setType("TestStep");
		item1.setId("1");

		MDMItem item2 = new MDMItem();
		item2.setSource("MDMTEST");
		item2.setType("Measurement");
		item2.setId("2");

		ShoppingBasketRequest request = new ShoppingBasketRequest();
		request.setName("my shopping basket (<äöüß\\/>)");
		request.setItems(Arrays.asList(item1, item2));
		return request;
	}

	private void validateAgainstXSD(String xml, InputStream xsd) {
		try {
			SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			Schema schema = factory.newSchema(new StreamSource(xsd));
			Validator validator = schema.newValidator();
			validator.validate(new StreamSource(new StringReader(xml)));
		} catch (Exception ex) {
			fail("XML could not be validated: " + xml, ex);
		}
	}

}
