/**
 * 
 */
package gr.uoa.di.webui.search;

import eu.dnetlib.domain.EPR;
import gr.uoa.di.driver.enabling.resultset.ResultSet;
import gr.uoa.di.driver.enabling.resultset.ResultSetFactory;

import java.util.List;

import org.apache.log4j.Logger;

/**
 * @author kiatrop
 *
 */
public class DocumentPage {

	private final Document[] documents;
	private final int pageSize;
	private final int currentPage;
	private final int numberOfDocuments;
	private final int numberOfPages;
	
	private Logger logger = Logger.getLogger(this.getClass());
	
	public DocumentPage(String epr, DocumentReader reader,
			int pageSize, int page) throws InvalidatedResultSet {
		this(ResultSetFactory.createResultSet(new EPR(epr)), reader, pageSize, page);
	}

	public DocumentPage(ResultSet<String> resultset, DocumentReader reader,
			int pageSize, int page) throws InvalidatedResultSet {
		
		// set sizes
		this.pageSize = pageSize;
		this.numberOfDocuments = resultset.size();
		this.numberOfPages = numberOfDocuments / pageSize
				+ ((numberOfDocuments % pageSize == 0) ? 0 : 1);
		if (page < 1) {
			currentPage = 1;
		} else if (page > numberOfPages) {
			currentPage = numberOfPages;
		} else {
			currentPage = page;
		}
		
		// call result set
		int from = (currentPage-1)*pageSize+1;
		int to = (currentPage)*pageSize;
		List<String> list = resultset.get(from, to);
		
		if (list == null) {
			throw new InvalidatedResultSet(resultset.getEpr());
		}
		
		// parse documents in page
		this.documents = new Document[list.size()];
		for (int i = 0; i < list.size(); i++) {
			logger.debug("list element " + i + ": " + list.get(i));
			documents[i] = reader.read(list.get(i));
		}
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public Document[] getDocuments() {
		return documents;
	}

	public int getNumberOfDocuments() {
		return numberOfDocuments;
	}

	public int getNumberOfPages() {
		return numberOfPages;
	}

	public int getPageSize() {
		return pageSize;
	}
}
