package eu.dnetlib.api.client;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

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

import org.apache.http.client.utils.URIBuilder;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.junit.Test;

import eu.dnetlib.api.utils.OpenAireDocumentPage;
import eu.dnetlib.api.utils.ResponseHeader;

public class OpenaireDatasetsApiClientTest extends OpenaireApiClientTest {

	@Test
	public void testDatasetsOpenaire() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(datasetsPath);
		String results = getApiClient().doRequest(EntityType.dataset, ApiModel.openaire, builder.build());
		Document doc = DocumentHelper.parseText(results);
		OpenAireDocumentPage page = new OpenAireDocumentPage(doc);
		ResponseHeader pageHeader = page.getResponseHeader();
		assertEquals(datasetsQuery, pageHeader.getQuery());
		assertEquals(1, pageHeader.getPage());
		assertEquals(defaultPageSize, pageHeader.getPageSize());
	}

	@Test
	public void testMaxPageSizeDataset() throws URISyntaxException, DocumentException {
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(datasetsPath).addParameter("size", "" + MAX_PAGE_SIZE + 1);
		URI uri = builder.build();
		System.out.println(uri);
		String results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		checkException(results, "java.lang.IllegalArgumentException");

		builder = new URIBuilder(requestBaseURL).setPath(datasetsPath).addParameter("size", "" + MAX_PAGE_SIZE);
		uri = builder.build();
		System.out.println(uri);
		results = getApiClient().doRequest(EntityType.publication, ApiModel.openaire, uri);
		checkNotException(results);

		assertTrue(MAX_NUM_RESULTS >= MAX_PAGE_SIZE);
	}

	@Test
	public void testDatasetParameters() throws URISyntaxException, DocumentException {
		for (String param : commonParameters) {
			if (!param.equals("model") && !param.equals("format") && !param.equals("page") && !param.equals("size") && !param.equals("sortBy")) {
				URIBuilder builder = new URIBuilder(requestBaseURL).setPath(datasetsPath).addParameter(param, "test");
				URI uri = builder.build();
				System.out.println(uri);
				String results = getApiClient().doRequest(EntityType.dataset, ApiModel.openaire, uri);
				checkNotException(results);
			}
		}
		for (String param : datasetParameters) {
			if (!param.equals("fromDateCollected") && !param.equals("toDateCollected")) {
				URIBuilder builder = new URIBuilder(requestBaseURL).setPath(datasetsPath).addParameter(param, "test");
				URI uri = builder.build();
				System.out.println(uri);
				String results = getApiClient().doRequest(EntityType.dataset, ApiModel.openaire, uri);
				checkNotException(results);
			}
		}
	}

	@Test
	public void testSortByDatasetsParameters() throws URISyntaxException, DocumentException {
		checkSortByParamaters(EntityType.dataset);
	}

	@Test
	public void testDatasetsOpenaireSortBy() throws URISyntaxException, DocumentException {
		String sortBy = "projectstartyear,descending";
		URIBuilder builder = new URIBuilder(requestBaseURL).setPath(datasetsPath).setParameter("sortBy", sortBy);
		String results = getApiClient().doRequest(EntityType.dataset, ApiModel.openaire, builder.build());
		System.out.println(results);
		// Document doc = DocumentHelper.parseText(results);
		// OpenAireDocumentPage page = new OpenAireDocumentPage(doc);
		// ResponseHeader pageHeader = page.getResponseHeader();
		// assertEquals(datasetsQuery, pageHeader.getQuery());
		// assertEquals(1, pageHeader.getPage());
		// assertEquals(defaultPageSize, pageHeader.getPageSize());
	}

}
