package eu.dnetlib.functionality.convert.app;

import static org.mockito.Mockito.mock;

import javax.xml.bind.JAXBException;

import junit.framework.Assert;

import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.BasicConfigurator;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import eu.dnetlib.api.functionality.ConversionServiceException;
import eu.dnetlib.domain.EPR;
import eu.dnetlib.domain.functionality.ConversionStatus;
import eu.dnetlib.functionality.convert.app.operator.ConversionStatusConverter;
import eu.dnetlib.functionality.convert.app.operator.ConversionTaskManagerImpl;
import eu.dnetlib.functionality.convert.store.ConversionServiceStoreImpl;
import eu.dnetlib.functionality.convert.store.FileStore;

public class ConversionServiceImplTest {

	static ConversionServiceImpl service = new ConversionServiceImpl();
	static TaskExecutor conversionExecutor = new ThreadPoolTaskExecutor();
	private static ConversionTaskManagerImpl manager =  new ConversionTaskManagerImpl();
	private static ConversionStatusConverter statusConverter = null;
	
	@BeforeClass
	public static void init() throws JAXBException {
		BasicConfigurator.configure();
		ConversionServiceStoreImpl conversionServiceStore = new ConversionServiceStoreImpl();
		statusConverter = new ConversionStatusConverter();
		statusConverter.init();
		
		((ThreadPoolTaskExecutor) conversionExecutor).afterPropertiesSet();
		service.setConversionExecutor(conversionExecutor);
		
		FileStore fileStore = new FileStore("/tmp/convertedFiles/test");
		conversionServiceStore.setStore(fileStore);		
		service.setStorage(conversionServiceStore);
		service.setStatusConverter(statusConverter);
		service.setServiceEPR(mock(EPR.class));
		manager.setStore(conversionServiceStore);
		manager.setStatusConverter(statusConverter);
	}
	
	@AfterClass
	public static void after() {
		((ThreadPoolTaskExecutor) conversionExecutor).shutdown();
		//new File("/tmp/convertedFiles/test/1234_pdf").delete();
	}	
	
	/*
	 * 
	 * <bean class="Converter">
	 * 	<property name="executor">
	 * 		<bean class="Thread..."/>
	 * 	</property>
	 * 
	 */
	

	@Test
	public void testTaskSubmition() throws ConversionServiceException {
		String url = "http://mpagasas.di.uoa.gr/driver/";
		String format = "pdf";
		
		ConversionStatus status = service.addJob(url, format);
		
		Assert.assertEquals(new String(Base64.encodeBase64((url+format).getBytes())), status.getConversionId());
		Assert.assertEquals(url, status.getFileUrl());
		Assert.assertEquals(format, status.getFormat());
//		Assert.assertEquals(ConversionStatus.Status.IN_PROGRESS, status.getStatus());
//		Assert.assertEquals(null, status.getConvertedFileUrl());
								
	/*	status = service.addJob("http://arxiv.org/pdf/0910.0377.pdf", "text");
		Assert.assertEquals(Base64.encode(("http://arxiv.org/pdf/0910.0377.pdf"+"text").getBytes()),status.getConversionId());
		Assert.assertEquals("text", status.getFormat());
		Assert.assertEquals("http://arxiv.org/pdf/0910.0377.pdf", status.getFileUrl());
		Assert.assertEquals(ConversionStatus.Status.COMPLETED, status.getStatus());
		System.out.println(status.getConvertedFileUrl());
				
		//add the same successful job
		status = service.addJob("http://arxiv.org/pdf/0910.0377.pdf", "text");
		Assert.assertEquals(0, manager.getActiveTasks().size());
	*/	
	}
	
}