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

import java.util.List;

import org.apache.log4j.Logger;

import eu.dnetlib.domain.data.Document;
import gr.uoa.di.driver.enabling.resultset.ResultSet;

/**
 * @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 final static DocumentPage EMPTY_PAGE = new DocumentPage();
	
	private DocumentPage() {
		documents = new Document[0];
		pageSize = 10;
		currentPage = 1;
		numberOfDocuments = 0;
		numberOfPages = 1;
	}
	
	public DocumentPage(List<Document> documents, int pageSize,
			int currentPage, int numberOfDocuments, int numberOfPages) {
		
		this.documents = documents.toArray(new Document[] {});
		this.pageSize = pageSize;
		this.currentPage = currentPage;
		this.numberOfDocuments = numberOfDocuments;
		this.numberOfPages = numberOfPages;
	}
	
	public DocumentPage(ResultSet<String> resultset, DocumentReader reader,
			int pageSize, int page) {
		
		// set sizes
		this.pageSize = pageSize;
		this.numberOfDocuments = resultset.size();
		
		if (numberOfDocuments == 0) {
			currentPage = 0;
			numberOfPages = 0;
			this.documents = new Document[0];
		
		} else { 
			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);
			
			// 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;
	}
}
