package eu.dnetlib.wds.resolver;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import eu.dnetlib.pid.resolver.mdstore.plugin.ResolverSerializer;
import eu.dnetlib.pid.resolver.model.ResolvedObject;
import eu.dnetlib.pid.resolver.store.ResolverStore;

import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ResolverConfiguration.class})
public class ResolverTest {


    @Autowired
    private DLIResolver dliResolver;

    @Autowired
    private OpenAireResolver openAireResolver;

    @Autowired
    private ResolverStore store;

    @Autowired
    private ResolverSerializer resolverSerializer;

    private final static String recordTemplate =
            "<root xmlns:oaf=\"http://namespace.dnet.eu/oaf\" xmlns:dri=\"http://www.driver-repository.eu/namespace/dri\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">%s</root>";


    @Test
    public void testDLIResolveNullObject() throws Exception {

        final WDSResolvedObject dli = dliResolver.resolve("https://spectradspace.lib.imperial.ac.uk:8443/metadata/handle/10042/to-7612/mets.xml", "url");
        assertNull(dli);

    }

    @Test
    public void testDLIResolvePublication() throws Exception {

        final ResolvedObject openaire = dliResolver.retrievePID("10.1016/j.quascirev.2011.06.004", "doi", false);

        final ResolvedObject doi_stored = store.getRecord("10.1016/j.quascirev.2011.06.004", "doi");
        assertNotNull(doi_stored);

        assertNotNull(openaire);
        final Gson g = new GsonBuilder().setPrettyPrinting().create();
        System.out.println("g.toJson(openaire) = " + g.toJson(openaire));

    }


    @Test
    public void testOpenAireResolvePublication() throws Exception {
        final ResolvedObject openaire = openAireResolver.retrievePID("10.1126/science.1141038", "DOI", false);
        assertNotNull(openaire);
        System.out.println(openaire.toJsonString());
        final ResolvedObject doi_stored = store.getRecord("10.1126/science.1141038", "doi");
        System.out.println(doi_stored.getType());
//        final Gson g = new GsonBuilder().setPrettyPrinting().create();
//        System.out.println("g.toJson(openaire) = " + g.toJson(openaire));
    }



    @Test
    public void testSerializationResolvedPublication() throws Exception {
        final WDSResolvedObject openaire = (WDSResolvedObject) openAireResolver.retrievePID("10.5281/zenodo.11082", "DOI", false);
        assertNotNull(openaire);
        openaire.addDate("IMPORTANT DATE", "20-09-1982");

        String format = String.format(recordTemplate, resolverSerializer.serializeToXML(openaire));

        System.out.println(format);
    }
}
