package com.palmnest.application.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 分页对象. 包含当前页数据及分页信息如总记录数.
 */
@SuppressWarnings("serial")
public class Page<T, PK> implements Serializable {

	private static int DEFAULT_PAGE_SIZE = 10;

	private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数

	private long page;

	//private long start; // 当前页第一条数据在List中的位置,从0开始

	private List<T> items; // 当前页中存放的记录,类型一般为List

	private long totalCount; // 总记录数

	/**
	 * 构造方法，只构造空页.
	 */
	@SuppressWarnings("unchecked")
	public Page() {
		this(0, 0, DEFAULT_PAGE_SIZE, new ArrayList());
	}

	/**
	 * 默认构造方法.
	 *
	 * @param start     本页数据在数据库中的起始位置
	 * @param totalSize 数据库中总记录条数
	 * @param pageSize  本页容量
	 * @param data      本页包含的数据
	 */
	public Page(long page, long totalSize, int pageSize, List<T> items) {
		this.pageSize = pageSize;
		if (page <= 0 || (page > this.getPages() && this.getPages() != 0)) {
			this.page = 1;
		} else
			this.page = page;
		this.totalCount = totalSize;
		this.items = items;
	}

	/**
	 * 取总记录数.
	 */
	public long getTotalCount() {
		return this.totalCount;
	}

	/**
	 * 取总页数.
	 */
	public long getPages() {
		/*if(pageSize<=0){
			return 1;
		}
		if (totalCount % pageSize == 0)
			return totalCount / pageSize;
		else
			return totalCount / pageSize + 1;*/
		long pages = 0;
		if (pageSize == 0)
			pages = 0;
		else
			pages = (this.totalCount + pageSize - 1) / pageSize;
		return pages;
	}

	/**
	 * 取每页数据容量.
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 取当前页中的记录.
	 */
	public List<T> getItems() {
		return items;
	}

	public void setItems(List<T> items) {
		this.items = items;
	}

	/**
	 * 取该页当前页码,页码从1开始.
	 *//*
	public void setCurrentPageNo() {
		this.currentPageNo= start / pageSize + 1;
	}*/
	public long getCurrentPage() {
		return this.page;
	}

	public boolean isHasFirst() {
		return this.getPages() >= 1;
	}

	public boolean isHasLast() {
		return this.page < this.getPages();
	}

	/**
	 * 该页是否有上一页.
	 */
	public boolean isHasPre() {
		return this.getPages() > 1;
	}

	/**
	 * 该页是否有下一页.
	 */
	public boolean isHasNext() {
		return this.page < this.getPages();
	}

	public int getFirstPage() {
		return 1;
	}

	public long getLastPage() {
		return this.getPages();
	}

	public long getNextPage() {
		return this.page + 1;
	}

	public long getPrePage() {
		return this.page - 1;
	}


	/**
	 * 获取任一页第一条数据在数据集的位置，每页条数使用默认值.
	 *
	 * @see #getStartOfPage(int, int)
	 */
	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 获取任一页第一条数据在数据集的位置.
	 *
	 * @param pageNo   从1开始的页号
	 * @param pageSize 每页记录条数
	 * @return 该页第一条数据
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}


	/**
	 * 默认展示最左（右）展示1个，中间展示5个，当前页居中
	 *
	 * @see Pagenation#getIterPages(int, int, int, int)
	 */
	public List<Integer> getIterPages() {
		int left_edge = 2, left_current = 3, right_current = 3, right_edge = 2;
		return getIterPages(left_edge, left_current, right_current, right_edge);
	}

	/**
	 * 返回分页工具条可用的页数<br>
	 * 如没页显示10条数据，166条数据，当前第6页。则结果为：<br>
	 * [1, null, 5, 6, 7, 8, 9, 10, null, 17]<br>
	 * 结果中值为null的元素用省略号等字符表示
	 *
	 * @return
	 * @author tianjie
	 * @date 26 Mar 2014 15:31:04
	 * @version v1.0
	 * @see flask_sqlalchemy#Pagination
	 */
	public List<Integer> getIterPages(int left_edge, int left_current,
									  int right_current, int right_edge) {
		List<Integer> ips = new ArrayList<Integer>();
		int last = 0;
		for (int num = 1; num < this.getPages() + 1; num++) {
			if (num < left_edge
					|| (num > this.page - left_current - 1 && num < this.page
					+ right_current)
					|| num > this.getPages() - right_edge) {
				if (last + 1 != num)
					ips.add(null);
				else
					ips.add(num);
				last = num;
			}
		}
		return ips;
	}
}