package com.xisc.pm.infra.util;

import io.choerodon.core.domain.Page;
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页工具类
 *
 * @author 纪文桃 wentao.ji01@hand-china.com
 * @since 2024-08-01 15:46:26
 */
public class PageUtils {
    private PageUtils() {}

    /**
     * 将列表数据转换为分页对象。
     * 该方法适用于手动分页，即根据已有的完整列表数据和分页请求信息，生成一个分页对象。
     *
     * @param list        原始数据列表。
     * @param pageRequest 分页请求对象，包含页码和每页大小等信息。
     * @return 返回一个填充好的分页对象，包含当前页的数据和其他分页信息。
     */
    public static <T> Page<T> convertListToPage(List<T> list, PageRequest pageRequest) {
        // 创建一个新的分页对象
        Page<T> page = new Page<>();
        // 设置当前页码和每页大小
        int p = pageRequest.getPage();
        int s = pageRequest.getSize();
        page.setNumber(p);
        page.setSize(s);
        // 设置总元素数量
        page.setTotalElements(list.size());
        // 设置当前页包含的元素数量
        page.setNumberOfElements(Math.min(s, list.size()));
        // 初始设置总页数为当前页码，后续根据实际情况进行调整
        page.setTotalPages(p);
        // 初始化当前页的内容列表
        page.setContent(new ArrayList<>());
        // 如果列表为空，直接返回
        if (CollectionUtils.isEmpty(list)) {
            return page;
        }
        // 如果页码小于0，表示不分页，直接将所有数据作为当前页内容
        if (p < 0) {
            page.setContent(list);
            return page;
        }
        // 根据列表大小和每页大小计算总页数
        page.setTotalPages((int) (list.size() - 1L) / s + 1);
        // 如果列表大小小于每页大小，说明数据不足一页
        // 判断
        if (list.size() < s) {
            // 如果是第0页，则将所有数据作为当前页内容
            if (p == 0) {
                page.setContent(list);
            } else {
                // 否则，当前页无内容
                page.setNumberOfElements(0);
            }
        } else {
            // 如果列表大小足够当前页显示
            if (list.size() >= (p + 1) * s) {
                // 直接取对应页码范围的数据作为当前页内容
                page.setContent(list.subList(p * s, (p + 1) * s));
            } else {
                // 如果列表大小不足显示下一页，取剩余数据作为当前页内容
                page.setContent(list.subList(p * s, list.size()));
            }
            // 如果当前页是最后一页，调整当前页包含的元素数量
            if (p >= page.getTotalPages() - 1) {
                page.setNumberOfElements(list.size() - p * s);
            }
        }
        // 返回填充好的分页对象
        return page;
    }
}
