package eu.dnetlib.api.client;

import java.net.URI;
import java.net.URISyntaxException;

import javax.xml.transform.Source;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.client.utils.URIBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;

public class ApiClientImpl implements ApiClient {

	private static final Log log = LogFactory.getLog(ApiClientImpl.class); // NOPMD by marko on 11/24/08 5:02 PM

	@Autowired
	private RestTemplate restTemplate;

	@Override
	public String doRequest(final EntityType entityType, final ApiModel apiModel, final URI requestURI) {
		log.debug("Request for entity: " + entityType + ", model: " + apiModel + ", URL: " + requestURI.toString());
		URIBuilder builder;
		try {
			builder = new URIBuilder(requestURI);
			if (apiModel != ApiModel.none) {
				builder.addParameter("model", apiModel.name());
			}
			return restTemplate.getForObject(builder.build(), String.class);
		} catch (URISyntaxException e) {
			throw new IllegalArgumentException(e);
		}

	}

	@Override
	public Source doRequestAsSource(final EntityType entityType, final ApiModel apiModel, final URI requestURI) {
		log.debug("Request for entity: " + entityType + ", model: " + apiModel + ", URL: " + requestURI.toString());
		URIBuilder builder;
		try {
			builder = new URIBuilder(requestURI);
			if (apiModel != ApiModel.none) {
				builder.addParameter("model", apiModel.name());
			}
			return restTemplate.getForObject(builder.build(), Source.class);
		} catch (URISyntaxException e) {
			throw new IllegalArgumentException(e);
		}
	}
}
