package eu.dnetlib.wds.parser;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import eu.dnetlib.rmi.enabling.ISLookUpService;
import eu.dnetlib.springutils.stringtemplate.StringTemplateFactory;
import eu.dnetlib.wds.resolver.OpenAireParser;
import eu.dnetlib.wds.resolver.WDSResolvedObject;
import eu.dnetlib.wds.resolver.serializers.WDSResolverSerializer;
import eu.dnetlib.wds.utils.WDSUtils;
import org.antlr.stringtemplate.StringTemplate;
import org.apache.commons.io.IOUtils;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

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

import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


@RunWith(MockitoJUnitRunner.class)
public class ParserTest {


    @Mock
    UniqueServiceLocator serviceLocator;


    @Mock
    ISLookUpService isLookUpService;


    @Mock
    WDSUtils wdsUtils;


    @Before
    public void setup() throws Exception {

        serviceLocator = mock(UniqueServiceLocator.class);
        isLookUpService = mock(ISLookUpService.class);
        wdsUtils = mock(WDSUtils.class);
        when(serviceLocator.getService(ISLookUpService.class)).thenReturn(isLookUpService);


        WDSUtils.setInstance(wdsUtils);

        when(wdsUtils.getServiceLocator()).thenReturn(serviceLocator);


        when(isLookUpService.quickSearchProfile(WDSUtils.COLLECTEDFROM_DATASOURCE_MAP_QUERY)).thenReturn(
                Arrays.asList(
                        "wds_________::r3d100010134<-->r3d100010134<-->Pangaea",
                        "wds_________::r3d100010255<-->r3d100010255<-->Inter-university Consortium for Political and Social Research",
                        "wds_________::r3d100010214<-->r3d100010214<-->World Data Center for Climate",
                        "wds_________::earthdata<-->cmr_________<-->EarthData",
                        "wds_________::r3d100000037<-->r3d100000037<-->Oak Ridge National Laboratory Distributed Active Archive Center for Biogeochemical Dynamics",
                        "wds_________::r3d100010299<-->r3d100010299<-->World Data Center for Climate",
                        "openaire____::bootstrap<-->openaire____<-->OpenAIRE Bootstrap"));
    }


    @Test
    public void testRegEx() {

        final Pattern pattern = Pattern.compile("10\\.\\d{4,9}/[-._;()/:A-Z0-9]+$", Pattern.CASE_INSENSITIVE);
        final List<String> input = Arrays.asList("https://doi.org/10.1594/PANGAEA.821878", "http://hs.pangaea.de/Images/Airphoto/PS", "https://doi.org/10.1051/epjcONnf/201009006");

        assertEquals(
                input.stream()
                        .filter(it ->
                        {
                            Matcher matcher = pattern.matcher(it);
                            return matcher.find();
                        }).count(),
                2);


    }


    @Test
    public void DMFParserTest() throws Exception {
        final InputStream inputStream = this.getClass().getResourceAsStream("/eu/dnetlib/wds/parser/DMFinput.xml");
        final String dmf = IOUtils.toString(inputStream);


        DMFResolverParser parser = new DMFResolverParser();

        WDSResolvedObject resolvedObject = (WDSResolvedObject) parser.parseObject(dmf);

        Assert.assertNotNull(resolvedObject.getType());

        Gson g = new GsonBuilder().setPrettyPrinting().create();

        assertNotNull(resolvedObject);

        System.out.println("resolvedObject = " + g.toJson(resolvedObject));

        WDSResolverSerializer serializer = new WDSResolverSerializer();

        final InputStream aStream = this.getClass().getResourceAsStream("/eu/dnetlib/wds/templates/DMFXML.st");


        serializer.setDmfTemplate(new StringTemplate(IOUtils.toString(aStream)));


        String xml = serializer.serializeToXML(resolvedObject);


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


    }

    @Test
    public void testOpenAireParser() throws IOException {
        OpenAireParser parser = new OpenAireParser();
        final InputStream inputStream = this.getClass().getResourceAsStream("/eu/dnetlib/wds/parser/openaire_input.xml");
        System.out.println(parser.parseObject(IOUtils.toString(inputStream)));
    }

}
