package eu.dnetlib.resolver;

import com.googlecode.protobuf.format.JsonFormat;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import eu.dnetlib.data.proto.dli.ScholixObjectProtos;
import eu.dnetlib.dli.resolver.*;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;

import eu.dnetlib.dli.resolver.model.DLIResolvedObject;
import eu.dnetlib.msro.workflows.nodes.ResolveAndIndexJobNode;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.bson.Document;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created by sandro on 9/8/16.
 */

public class DLIResolverTest extends DLIAbstractTest {

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


	@Test
    @Ignore
    public void TestNCBIResolver() throws IOException, URISyntaxException {
	    NCBINResolver resolver = new NCBINResolver();
	    NCBINParser parser = new NCBINParser();
	    resolver.setNCBINParser(parser);


        DLIResolvedObject resolve = resolver.resolve("mg456816", "ncbi");

        System.out.println(resolve);

        CrossRefParserJSON parserJSON = new CrossRefParserJSON();
        final String json = IOUtils.toString(this.getClass().getResourceAsStream("/eu/dnetlib/dli/parser/crossRefItem.json"));

        DLIResolvedObject dliResolvedObject = parserJSON.parseRecord(json);
        final ScholixObjectProtos.ScholixResource source = ResolveAndIndexJobNode.generateResource(resolve);
        final ScholixObjectProtos.ScholixResource target = ResolveAndIndexJobNode.generateResource(dliResolvedObject);

        final ScholixObjectProtos.Scholix.Builder scholix = ScholixObjectProtos.Scholix.newBuilder();

        scholix.addLinkproviderBuilder()
                .setName("Elsevier")
                .addIdentifiersBuilder()
                .setIdentifier("dli_________::elsevier")
                .setSchema("dnetIdentifier");

        scholix.setRelationship(ScholixObjectProtos.ScholixRelationship.newBuilder()
                .setName("IsRelatedTo")
                .setInverse("IsRelatedTo")
                .setSchema("datacite")
                .build());


        scholix.setSource(source);
        scholix.setTarget(target);
        scholix.setPublicationDate(LocalDateTime.now().toString());

        String id ="AWWmUI5Q653lpHSHRYaq";

        final String curlString =String.format("curl -X PUT \"10.0.6.47:9200/dli/scholix/%s \" -H 'Content-Type: application/json' -d'%s'",id,JsonFormat.printToString(scholix.build()));

        System.out.println(curlString);
    }


    @Test
    @Ignore
    public void TestResolveLotOfPid() throws IOException {
        final NCBINResolver resolver = new NCBINResolver();
        NCBINParser parser = new NCBINParser();
        resolver.setNCBINParser(parser);




        InputStream resourceAsStream = this.getClass().getResourceAsStream("/eu/dnetlib/dli/parser/pid_ncbi");
        BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream));
        String line = null;

        List<String> resolvePid = new ArrayList<>();

        while ((line= reader.readLine())!=null) {
            resolvePid.add(line.trim().toLowerCase());
        }
        long resolvedCNT = resolvePid.parallelStream()
                .map(it -> {
                    DLIResolvedObject ncbi = resolver.resolve(it.trim().toLowerCase(), "ncbi");
                    if (ncbi == null) {
                        log.error("Unable to Resolve " + it);
                        return null;
                    }
                    return ncbi.getPid();
                }).filter(it -> it != null).count();

        System.out.printf("Total item resolved %d/%d",resolvedCNT, resolvePid.size());


    }


    @Test
    public void crossRefResolverTest() {
	    CrossrefResolver r = new CrossrefResolver();

	    r.setDumpType("ES");

	    r.setParser(new CrossRefParserJSON());
        final DLIResolvedObject doi = r.resolve("10.1038/s41467-018-07866-8", "doi");



        System.out.println(doi);


    }


    @Test
    public void testDataciteOfflineResolver() {


        List<String> dois = Arrays.asList(
                "10.12688/amrcopenres.12873.1");

        DataciteOfflineResolver resolver = new DataciteOfflineResolver();
        dois.forEach(it -> System.out.println(resolver.resolve(it, "doi")));



    }

    @Test
    public void testDataciteResolver() {
        DataciteResolver resolver = new DataciteResolver();
        System.out.println(resolver.resolve("10.5438/0012", "doi"));
    }

}

