package eu.dnetlib.resolver;

import com.google.gson.Gson;
import eu.dnetlib.data.transform.OntologyLoader;
import eu.dnetlib.dli.DLIUtils;
import eu.dnetlib.dli.resolver.ENAResolver;
import eu.dnetlib.dli.resolver.PIDResolver;
import eu.dnetlib.dli.resolver.ResolverStore;
import eu.dnetlib.dli.resolver.model.ResolvedObject;
import eu.dnetlib.dli.resolver.model.serializer.ResolverSerializer;
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import eu.dnetlib.resolver.store.ConfigurationResolverStoreTestConfig;
import eu.dnetlib.rmi.enabling.ISLookUpService;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static org.mockito.Mockito.when;

/**
 * Created by sandro on 9/8/16.
 */
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = { ConfigurationTestConfig.class, ConfigurationResolverStoreTestConfig.class })
@Ignore
public class DLIResolverTest {

	private static final Log log = LogFactory.getLog(DLIResolverTest.class);

	@Resource(name = "andsResolver")
	private PIDResolver andsDataciteResolver;

	@Resource(name = "pubMedResolver")
	private PIDResolver pubMedResolver;

	@Resource(name = "openaireResolver")
	private PIDResolver openaireResolver;

	@Resource(name = "crossrefResolver")
	private PIDResolver crossrefResolver;

	@Resource(name = "rcsbResolver")
	private PIDResolver rcsbResolver;

    @Resource(name = "enaResolver")
    private ENAResolver enaResolver;

	@Resource(name = "dataciteResolver")
	private PIDResolver dataciteResolver;

	@Autowired
	private ResolverStore store;

	@Autowired
	private ResolverSerializer serializer;

    @Mock
    private DLIUtils dliUtilsInstance;


    @Mock
    private UniqueServiceLocator uniqueServiceLocator;

    @Mock
    private ISLookUpService isLookUpServiceMock;


	@Before
    public void initialize() throws Exception {

		store.checkIntegrityCollection();
		store.getResolverCollection().drop();
        final String query = "for $x in collection('/db/DRIVER/RepositoryServiceResources/RepositoryServiceResourceType') "
                + "return concat($x//FIELD[./key='NamespacePrefix']/value/text(),'@--@',$x//FIELD[./key='DataSourceId']/value/text(),'@--@',$x//ENGLISH_NAME )";
        dliUtilsInstance = Mockito.mock(DLIUtils.class);

        uniqueServiceLocator = Mockito.mock(UniqueServiceLocator.class);
        isLookUpServiceMock = Mockito.mock(ISLookUpService.class);
        dliUtilsInstance.setServiceLocator(uniqueServiceLocator);

        DLIUtils.setInstance(dliUtilsInstance);
        when(dliUtilsInstance.getServiceLocator()).thenReturn(uniqueServiceLocator);
		final InputStream inputStream = this.getClass().getResourceAsStream("/eu/dnetlib/transformation/data-center.json");

        when(dliUtilsInstance.getDataciteDatasource()).thenReturn(new Gson().fromJson(IOUtils.toString(inputStream), Map.class));


        when(uniqueServiceLocator.getService(ISLookUpService.class)).thenReturn(isLookUpServiceMock);
        List<String> resutlDS = Arrays.asList(
                "r3d100010255@--@dli_________::r3d100010255@--@icpsr",
                "datacite____@--@dli_________::datacite____@--@Datasets in Datacite",
                "r3d100010134@--@dli_________::r3d100010134@--@pangaea",
                "r3d100010527@--@dli_________::r3d100010527@--@European Nucleotide Archive"


        );
        when(isLookUpServiceMock.quickSearchProfile(query)).thenReturn(resutlDS);
        DLIUtils.ontologies = OntologyLoader.loadOntologiesFromCp();



	}

	@Test
	public void andsResolverTest() throws Exception {
		andsDataciteResolver.retrievePID("https://researchdata.ands.org.au/registry/registry_object/view/2756", "url");
		andsDataciteResolver.retrievePID("https://researchdata.ands.org.au/registry/registry_object/view/2756", "url");
		andsDataciteResolver.retrievePID("https://researchdata.ands.org.au/registry/registry_object/view/2756", "url");
		final ResolvedObject doi = andsDataciteResolver.retrievePID("https://researchdata.ands.org.au/registry/registry_object/view/2756", "url");
		Assert.assertNotNull(doi);
		Assert.assertNotNull(doi.getTitles());
		Assert.assertNotNull(doi.getDatasourceProvenance());
		log.info(doi.getDatasourceProvenance());

	}

	@Test
	public void pubmedResolverTest() throws Exception {
        final ResolvedObject pubmedObject = pubMedResolver.retrievePID("355643", "pubmedid");
        Assert.assertNotNull(pubmedObject);
		Assert.assertNotNull(pubmedObject.getAuthors());
		Assert.assertNotNull(pubmedObject.getTitles());
	}

	@Test
	public void openaireResolverTest() throws Exception {
		final ResolvedObject pubmedObject = openaireResolver.retrievePID("oai:dnet:od_______908::f602032c963cc56d6c9e80508ece44d3", "openaire");
		System.out.println("pubmedObject = " + pubmedObject);
		Assert.assertNotNull(pubmedObject);
		Assert.assertNotNull(pubmedObject.getAuthors());
		Assert.assertNotNull(pubmedObject.getTitles());
	}

	@Test
	public void crossRefResolverTest() throws Exception {
		final ResolvedObject pubmedObject = crossrefResolver.retrievePID("10.1109/5.771073", "Handle");
		Assert.assertNotNull(pubmedObject);
		Assert.assertNotNull(pubmedObject.getAuthors());
		Assert.assertNotNull(pubmedObject.getTitles());
	}

	@Test
	public void rcsbResolverTest() throws Exception {
		final ResolvedObject pubmedObject = rcsbResolver.retrievePID("2C2V", "pdb");
		Assert.assertNotNull(pubmedObject);
		Assert.assertNotNull(pubmedObject.getAuthors());
		Assert.assertNotNull(pubmedObject.getTitles());

	}

    @Test
    public void enaResolverTest() throws java.lang.Exception {
        final ResolvedObject enaObject = enaResolver.retrievePID("KP866224", "ena");
        Assert.assertNotNull(enaObject);
        Assert.assertNotNull(enaObject.getAuthors());
        Assert.assertNotNull(enaObject.getTitles());


        System.out.println("enaObject = " + enaObject);

    }

	@Test
	public void dataciteResolverTest() {
		final String[] dois = {"10.4121/uuid:c1d1fdbb-72df-470d-9315-d6f97e1d7c7c", "10.5517/ccnwwp2",
				"10.6085/AA/TPT006_061MXTI061R00_20020806.50.3", "10013/epic.26895.d001" };
		int k = 0;
		double average_sum = 0.0f;
		ResolvedObject object = dataciteResolver.retrievePID(dois[0], "handle");
		Assert.assertNotNull(object);
		object = dataciteResolver.retrievePID(dois[1], "doi");
		Assert.assertNotNull(object);
		log.info(object);
		log.info(object.getSubjects());
		log.info(serializer.serializeToXML(object));

	}

}

