package com.sckw.core.model.page;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sckw.core.utils.ReflectionUtils;

import java.util.List;

/**
 * MyBatis 分页查询助手
 * @author zk
 * @date Nov 24, 2018
 */
public class PageHelperUtil {

    public static final String FIND_PAGE = "findPage";

    /**
     * 分页查询, 约定查询方法名为 “findPage”
     * @param pageRequest 分页请求
     * @param mapper Dao对象，MyBatis的 Mapper
     */
    public static PageResult findPage(PageRequest pageRequest, Object mapper) {
        return findPage(pageRequest, mapper, FIND_PAGE);
    }

    /**
     * 调用分页插件进行分页查询
     * @param pageRequest 分页请求
     * @param mapper Dao对象，MyBatis的 Mapper
     * @param queryMethodName 要分页的查询方法名
     * @param args 方法参数
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) {
        // 设置分页参数
        int pageNum = pageRequest.getPage();
        int pageSize = pageRequest.getPageSize();
        PageHelper.startPage(pageNum, pageSize);
        // 利用反射调用查询方法
        Object result = ReflectionUtils.invoke(mapper, queryMethodName, args);
        return getPageResult(pageRequest, new PageInfo((List) result));
    }

    /**
     * 将分页信息封装到统一的接口
     */
    private static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) {
        return setPageResult(pageInfo);
    }

    /**
     * 将分页信息封装到统一的接口
     * @return PageResult
     */
    public static PageResult getPageResult(PageInfo<?> pageInfo) {
        return setPageResult(pageInfo);
    }

    /**
     * 将分页信息封装到统一的接口  针对于有复杂的业务组装接口
     * @return PageResult
     */
    public static PageResult getPageResult(PageInfo<?> pageInfo, List<?> totalList, int pageSize) {
        PageInfo<?> pageInfoTotal = new PageInfo<>(totalList);
        pageInfo.setTotal(pageInfoTotal.getTotal());
        pageInfo.setPageSize(pageSize);
        return setPageResult(pageInfo);
    }

    public static PageResult setPageResult(PageInfo<?> pageInfo){
        PageResult pageResult = new PageResult();
        pageResult.setPage(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setSize(pageInfo.getTotal());
        pageResult.setPages(pageInfo.getPages());
        pageResult.setList(pageInfo.getList());
        return pageResult;
    }
}
