package com.app.framework.core.support.view.grid;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.io.Serializable;

/**
 * 分页参数对象
 * 包含排序字段和排序方式
 */
public class Paging implements Serializable{
	private static final long serialVersionUID = 2837480041430890963L;
	
	/**
	 * 构造函数
	 */
	public Paging(){}
	
	/**
	 * 有参构造函数
	 * @param isPage	是否分页
	 */
	public Paging(Boolean isPage){
		this.isPage = isPage;
	}

	/**
	 * 有参构造函数
	 * @param pageNo 当前页码
	 * @param limit	每页显示记录数
	 */
	public Paging(Integer pageNo, Integer limit){
		this.pageNo = pageNo;
		this.limit = limit;
	}
	
	/**当前页码*/
	private Integer pageNo  = null;
	/**起始记录数*/
	private Integer start = null;
	/**每页显示记录数*/
	private Integer limit = 10;
	/**排序方式(desc || asc),多个用","分隔(与sort的每个字段对应)*/
	private String  dir;
	/**排序字段,多个字段用","分隔*/
	private String  sort;
	/**查询参数*/
	private Object  queryPara;
	/**总记录数*/
	private Long    totalCount;
	/**总页数*/
	private Long 	totalPage;
	/**是否分页*/
	private Boolean isPage = true;
	/**是否查询总记录数*/
	private Boolean isCountPage = true;

	public String toString(){
		return "Page [当前页码=" + pageNo + ", 起始记录数=" + start + ", 每页显示记录数=" + limit + ", 排序字段=" + sort + ", 排序方式=" + dir + ", 是否分页=" + isPage + ", 是否查询总记录数=" + isCountPage + "]";
	}
	
	/**
	 * 获取起始记录数
	 */
	public Integer getStart() {
		if(start == null && pageNo != null && limit != null){
			//根据页码计算起始记录数
			start = (pageNo-1) * limit;
		}
		if(start == null)start = 0;
		return start;
	}
	/**
	 * 获取每页显示记录数
	 */
	public Integer getLimit() {
		if(limit == null)limit = 10;
		return limit;
	}
	/**
	 * 获取排序方式
	 */
	public String getDir() {
		return dir;
	}
	/**
	 * 获取排序字段
	 */
	public String getSort() {
		return sort;
	}
	/**
	 * 设置起始记录数
	 * @param start
	 */
	public void setStart(Integer start) {
		this.start = start;
	}
	/**
	 * 设置每页显示记录数
	 * @param limit
	 */
	public void setLimit(Integer limit) {
		this.limit = limit;
	}
	/**
	 * 设置排序方式
	 * @param dir
	 */
	public void setDir(String dir) {
		this.dir = dir;
	}
	/**
	 * 设置排序字段
	 * @param sort
	 */
	public void setSort(String sort) {
		this.sort = sort;
	}
	/**
	 * 获取查询参数
	 */
	public Object getQueryPara() {
		return queryPara;
	}
	/**
	 * 设置查询参数
	 * @param queryPara
	 */
	public void setQueryPara(Object queryPara) {
		this.queryPara = queryPara;
	}
	/**
	 * 获取总记录数
	 */
	public Long getTotalCount() {
		return totalCount;
	}
	/**
	 * 设置总记录数
	 * @param totalCount
	 */
	public void setTotalCount(Long totalCount) {
		this.totalCount = totalCount;
	}
	/**
	 * 获取是否分页
	 */
	public Boolean getIsPage() {
		if(isPage == null)isPage = false;
		return isPage;
	}
	/**
	 * 设置是否分页
	 * @param isPage
	 */
	public void setIsPage(Boolean isPage) {
		if(isPage == null)isPage = false;
		this.isPage = isPage;
		if(false == isPage){
			this.isCountPage = false;
		}
	}
	/**
	 * 获取是否计算总记录数
	 */
	public Boolean getIsCountPage() {
		if(isCountPage == null)isCountPage = false;
		return isCountPage;
	}
	/**
	 * 设置是否计算总记录数
	 * @param isCountPage
	 */
	public void setIsCountPage(Boolean isCountPage) {
		this.isCountPage = isCountPage;
	}
	/**
	 * 获取当前显示的页码
	 */
	public Integer getPageNo() {
		if(pageNo == null && start != null && limit != null){
			//根据起始记录数计算当前页码
			pageNo = (start/limit) + 1;
		}
		if(pageNo == null)pageNo = 1;
		return pageNo;
	}
	/**
	 * 设置当前显示的页码
	 * @param pageNo
	 */
	public void setPageNo(Integer pageNo) {
		this.pageNo = pageNo;
	}
	/**
	 * 获取总页数
	 */
	public Long getTotalPage() {
		if(totalCount !=null && limit != null && limit > 0){
			totalPage = (totalCount + limit-1) / limit;
		}
		return totalPage;
	}
	/**
	 * 设置总页数
	 * @param totalPage
	 */
	public void setTotalPage(Long totalPage) {
		this.totalPage = totalPage;
	}
	
	/**
	 * 判断是否分页
	 * @param paging	分页对象
	 * @return true:分页  false:不分页
	 */
	public static boolean isPage(Paging paging){
		if(paging != null && paging.getIsPage()){
			return true;
		}
		return false;
	}
	/**
	 * 判断是否查询总记录数
	 * @param paging	分页对象
	 * @return true:查询总记录数  false:不查询总记录数
	 */
	public static boolean isCountPage(Paging paging){
		if(paging != null && paging.getIsCountPage()){
			return true;
		}
		return false;
	}

	/**
	 * 设置Mybatis分页插件返回Page对象
	 * @param page
	 * @return	Paging
	 */
	public static Paging setPage(Paging paging, Page page){
		if(paging == null){
			paging = new Paging(false);
		}
		paging.setTotalPage(page.getPages());
		paging.setTotalCount(page.getTotal());
		return paging;
	}

	/**
	 * 判断是否分页
	 * @param paging	分页对象
	 * @return true:分页  false:不分页
	 */
	public static Page page(Paging paging){
		if(paging != null && paging.getIsPage()){
			return new Page<>(paging.getPageNo(), paging.getLimit());
		}
		return new Page<>(1, -1);
	}
}
