package eu.dnetlib.wds.transformation;

import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import eu.dnetlib.rmi.enabling.ISLookUpService;
import eu.dnetlib.wds.utils.WDSUtils;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.Arrays;

import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class WDSTransformTest {

    @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.HOSTED_BY_MAP_QUERY)).thenReturn(
                Arrays.asList(
                        "14e0bfe8-a224-4516-ba74-056d5469e0e8<-->BIFWMS<-->Center for Biodiversity and Conservation, American Museum of Natural History",
                        "8cc5c356-bd45-47f1-85c7-a77cb968aa60<-->JIC<-->John Innes Centre",
                        "d5ea90ca-5faf-4c45-a8c1-84274ef672ff<-->DU/GPR<-->Great Plains Region, Ducks Unlimited, Inc.",
                        "c417024e-1d24-446b-88c7-6456fc44082c<-->WFC/FB<-->FishBase, WorldFish Center",
                        "50acc4de-aa45-4979-800a-948eefc291d6<-->CVAG<-->Coachella Valley Association of Governments",
                        "92dc7d21-d324-42da-9d82-3ec0f9b744f1<-->MDIWQC<-->Mount Desert Island Water Quality Coalition",
                        "43ce00b0-642e-4c1b-a3ca-e1424e392805<-->BDS<-->British Dragonfly Society",
                        "c7898f3c-6525-496f-a1f9-7794e6cabf7d<-->NSGIC<-->National States Geographic Information Council",
                        "bbdfc1d8-f44a-4898-8bc5-251c57b262d9<-->EFI<-->European Forest Institute",
                        "00a50ef2-5ed3-476d-bbfa-2b6558657672<-->SWRI<-->Southwest Research Institute")
        );
    }


    @Test
    public void testCMRTransform() throws Exception {
        final InputStream xsltAsStream = getClass().getResourceAsStream("/eu/dnetlib/wds/transform/cmr_transformation.xslt");


        final TransformerFactory factory = TransformerFactory.newInstance();
        factory.newTransformer();
        final StreamSource xsltSource = new StreamSource(xsltAsStream);
        final InputStream recordStream = this.getClass().getResourceAsStream("/eu/dnetlib/wds/transform/cmr.xml");
        final Transformer transformer = factory.newTransformer(xsltSource);
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        final StringWriter output = new StringWriter();
        transformer.transform(new StreamSource(recordStream), new StreamResult(output));
        System.out.println(output.toString());
    }

    @Test
    public void testDCTransform() throws Exception{
        final InputStream xsltAsStream = getClass().getResourceAsStream("/eu/dnetlib/wds/transform/dc2dbmf.xslt");
        final TransformerFactory factory = TransformerFactory.newInstance();
        factory.newTransformer();
        final StreamSource xsltSource = new StreamSource(xsltAsStream);
        final InputStream recordStream = this.getClass().getResourceAsStream("/eu/dnetlib/wds/transform/dc.xml");
        final Transformer transformer = factory.newTransformer(xsltSource);
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        final StringWriter output = new StringWriter();
        transformer.transform(new StreamSource(recordStream), new StreamResult(output));
        System.out.println(output.toString());
    }

    @Test
    public void testDIFTransform() throws Exception{
        final InputStream xsltAsStream = getClass().getResourceAsStream("/eu/dnetlib/wds/transform/dif2dbmf.xslt");
        final TransformerFactory factory = TransformerFactory.newInstance();
        factory.newTransformer();
        final StreamSource xsltSource = new StreamSource(xsltAsStream);
        final InputStream recordStream = this.getClass().getResourceAsStream("/eu/dnetlib/wds/transform/dif.xml");
        final Transformer transformer = factory.newTransformer(xsltSource);
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        final StringWriter output = new StringWriter();
        transformer.transform(new StreamSource(recordStream), new StreamResult(output));
        System.out.println(output.toString());
    }


}
