package eu.dnetlib.resolver;

import java.io.IOException;

import eu.dnetlib.dli.DLIUtils;
import eu.dnetlib.dli.resolver.*;
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import eu.dnetlib.dli.resolver.model.serializer.ResolverSerializer;
import net.sf.ehcache.Cache;
import org.antlr.stringtemplate.StringTemplate;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.springframework.cache.ehcache.EhCacheFactoryBean;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigurationTestConfig {

	@Bean
	public UniqueServiceLocator serviceLocator() {
		return null;
	}



	@Bean
	public StringTemplate pmfSerializerTemplate() throws IOException {
		final String template = IOUtils.toString(getClass().getResourceAsStream("/eu/dnetlib/dli/templates/PMFXML.st"));
		final StringTemplate st = new StringTemplate(template);
		return st;
	}

	@Bean
	public StringTemplate dmfSerializerTemplate() throws IOException {
		final String template = IOUtils.toString(getClass().getResourceAsStream("/eu/dnetlib/dli/templates/DMFXML.st"));
		final StringTemplate st = new StringTemplate(template);
		return st;
	}

	@Bean
	public StringTemplate scholixSerializerTemplate() throws IOException {
		final String template = IOUtils.toString(getClass().getResourceAsStream("/eu/dnetlib/dli/templates/ScholixXML.st"));
		final StringTemplate st = new StringTemplate(template);
		return st;
	}

	@Bean
	public ResolverSerializer resolverSerializer() throws IOException {
		final ResolverSerializer serializer = new ResolverSerializer();
		serializer.setDmfTemplate(dmfSerializerTemplate());
		serializer.setPmfTemplate(pmfSerializerTemplate());
		serializer.setScholixTemplate(scholixSerializerTemplate());
		return serializer;
	}


	@Bean
	public ANDSResolver andsResolver() {
		final ANDSResolver resolver = new ANDSResolver();
		resolver.setCache((Cache) ResolverCache().getObject());
		resolver.setName("ANDSDataciteResolver");
		return resolver;
	}

    @Bean
    public ENAResolver enaResolver() {
        final ENAResolver resolver = new ENAResolver();
        resolver.setCache((Cache) ResolverCache().getObject());
        resolver.setName("ENAResolver");
        return resolver;
    }

	@Bean
	public CrossrefResolver crossrefResolver() {
		final CrossrefResolver resolver = new CrossrefResolver();
		resolver.setCache((Cache) ResolverCache().getObject());
		resolver.setName("CrossrefResolver");
		return resolver;
	}

	@Bean
	public CrossRefParserJSON crossRefParser() {
		return new CrossRefParserJSON();
	}

	@Bean
	public PubMedResolver pubMedResolver() {
		final PubMedResolver resolver = new PubMedResolver();
		resolver.setCache((Cache) ResolverCache().getObject());
		resolver.setName("PubMedResolver");
		return resolver;
	}

	@Bean
	public DataciteResolver dataciteResolver() {
		final DataciteResolver resolver = new DataciteResolver();
		resolver.setCache((Cache) ResolverCache().getObject());
		resolver.setName("DataciteResolver");
		return resolver;
	}

	@Bean
	public RCSBResolver rcsbResolver() {
		final RCSBResolver resolver = new RCSBResolver();
		resolver.setCache((Cache) ResolverCache().getObject());
		resolver.setName("RCSBResolver");
		return resolver;
	}

	@Bean
	public RCSBParser rcsbParser() {
		return new RCSBParser();
	}

	@Bean
	public OpenaireResolver openaireResolver() {
		final OpenaireResolver resolver = new OpenaireResolver();
		resolver.setCache((Cache) ResolverCache().getObject());
		resolver.setName("OpenaireResolver");
		return resolver;
	}

	@Bean
	public EhCacheManagerFactoryBean cacheFactory() {
		EhCacheManagerFactoryBean cacheFactory = new EhCacheManagerFactoryBean();
		cacheFactory.setCacheManagerName("testCacheFactory");
		return cacheFactory;
	}

	@Bean
	public EhCacheFactoryBean ResolverCache() {
		EhCacheFactoryBean doiCacheFactoryBean = new EhCacheFactoryBean();
		doiCacheFactoryBean.setEternal(false);
		doiCacheFactoryBean.setTimeToLive(0);
		doiCacheFactoryBean.setTimeToIdle(36000);
		doiCacheFactoryBean.setMaxEntriesLocalHeap(10000);
		doiCacheFactoryBean.setMaxEntriesLocalDisk(20000);
		doiCacheFactoryBean.setCacheManager(cacheFactory().getObject());
		doiCacheFactoryBean.setCacheName("TestResolverCache");
		return doiCacheFactoryBean;
	}

}





