package eu.dnetlib.data.utility.featureextraction.nh;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.when;

import java.util.LinkedHashMap;
import java.util.Map;

import javax.xml.bind.JAXBException;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;

import eu.dnetlib.data.utility.featureextraction.Feature;
import eu.dnetlib.data.utility.featureextraction.FeatureExtractionServiceParameters;
import eu.dnetlib.data.utility.featureextraction.dataprovider.FeatureExtractionDataProvider;
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
import eu.dnetlib.enabling.tools.ServiceLocator;
import eu.dnetlib.enabling.tools.blackboard.ActionStatus;
import eu.dnetlib.enabling.tools.blackboard.BlackboardHandlerImpl;
import eu.dnetlib.enabling.tools.blackboard.BlackboardJobImpl;
import eu.dnetlib.enabling.tools.blackboard.BlackboardMessage;
import eu.dnetlib.enabling.tools.blackboard.BlackboardMessageImpl;
import eu.dnetlib.enabling.tools.blackboard.BlackboardParameter;
import eu.dnetlib.enabling.tools.blackboard.BlackboardParameterImpl;
import eu.dnetlib.miscutils.jaxb.JaxbFactory;

@RunWith(MockitoJUnit44Runner.class)
public class NotificationHandlerTest {

	private transient FeatureExtractionNotificationHandler nh;
	
	@Mock
	private transient ResultSetService rsService;
	
	@Mock
	private transient FeatureExtractionDataProvider dp;
	
	private transient BlackboardHandlerImpl bbHandler;
	
	private transient BlackboardJobImpl job;
	
	@Mock
	private transient ServiceLocator<ISRegistryService> registryLocator;
	
	@Mock
	private transient ISRegistryService registryService;
	
	@Mock
	private transient JaxbFactory<BlackboardMessage> messageFactory;

	private transient Map<String, Feature> featureMap = new LinkedHashMap<String, Feature>();
	
	private transient BlackboardMessage bbMessage;
	
	@Before
	public void setUp() throws JAXBException{
		Feature f = new Feature();
		f.setName("language");
		featureMap.put(f.getName(), f);
		when(dp.getFeatureMap()).thenReturn(featureMap);

		when(registryLocator.getService()).thenReturn(registryService);

		bbHandler = new BlackboardHandlerImpl();
		bbHandler.setRegistryLocator(registryLocator);
		bbHandler.setMessageFactory(messageFactory);
		
		bbMessage = new BlackboardMessageImpl();
		BlackboardParameter p = new BlackboardParameterImpl();
		p.setName(FeatureExtractionServiceParameters.PARAM_NAME_FEATURE);
		p.setValue("invalidFeature");
		bbMessage.getParameters().add(p);
		
		job = new BlackboardJobImpl("serviceId", bbMessage);
		when(messageFactory.serialize(bbMessage)).thenReturn("someMessage");
		nh = new FeatureExtractionNotificationHandler();
		nh.setDataProvider(dp);
		nh.setResultsetService(rsService);
		nh.setBlackboardHandler(bbHandler);
		
	}
	
	@Test
	public void testActionTypeFailed(){
		bbMessage.setAction("someInValidAction");
		assertNotNull(nh.getBlackboardHandler());
		assertNotNull(job.getAction());
		assertNotNull(job.getParameters());
		nh.processJob(job);
		assertEquals(ActionStatus.FAILED, job.getActionStatus());
		assertNotNull("should contain a IllegalArgumentException", job.getError());
		System.out.println(job.getError());
	}
	
	@Test
	public void testFeatureFailed(){

		bbMessage.setAction("EXTRACT");
		nh.processJob(job);
		assertEquals(ActionStatus.FAILED, job.getActionStatus());
		assertNotNull("should contain a not supported feature - FeatureExctractionException", job.getError());
		System.out.println(job.getError());
		
	}
	
	@Test
	public void testSrcEprFailed(){
		bbMessage.setAction("EXTRACT");
		BlackboardParameter p = new BlackboardParameterImpl();
		p.setName(FeatureExtractionServiceParameters.PARAM_NAME_FEATURE);
		p.setValue("language");
		bbMessage.getParameters().add(p);
		
		job = new BlackboardJobImpl("serviceId", bbMessage);
		nh.processJob(job);
		assertEquals(ActionStatus.FAILED, job.getActionStatus());
		assertNotNull("should contain a missing srcEpr parameter - FeatureExctractionException", job.getError());
		System.out.println(job.getError());
		
	}
	
}
