package com.simuwang.base.common.support;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.simuwang.base.common.conts.Constants;
import com.simuwang.base.common.support.vo.BaseVO;

import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author wangzaijun
 * @date 2024/9/13 14:01
 * @description 数据库分页包装对象
 */
public class MybatisPage<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = Constants.DEFAULT_SERIAL_ID;
    /**
     * 总数
     */
    private Long total;
    /**
     * 当前页记录
     */
    private List<T> records;

    public MybatisPage() {
    }

    /**
     * 提供一个快速构建PageResult的工具
     *
     * @param page     mybatis分页对象
     * @param function dto与t对象转换函数
     * @param <T>      实体对象
     * @param <VO>     dto数据传输对象
     * @return PageResult
     */
    public static <T, VO extends BaseVO> MybatisPage<VO> of(IPage<T> page, Function<List<T>, List<VO>> function) {
        List<VO> list = function.apply(page.getRecords());
        return new MybatisPage<VO>().total(page.getTotal()).records(list);
    }

    /**
     * 提供一个快速构建PageResult的工具
     *
     * @param page     mybatis分页对象
     * @param function dto与t对象转换函数
     * @param <T>      实体对象
     * @param <VO>     dto数据传输对象
     * @return PageResult
     */
    public static <T, VO extends BaseVO> MybatisPage<VO> ofList(IPage<T> page, Function<T, VO> function) {
        List<T> records = page.getRecords();
        List<VO> list = null;
        if (CollUtil.isNotEmpty(records)) {
            list = records.stream().map(function).collect(Collectors.toList());
        }
        return new MybatisPage<VO>().total(page.getTotal()).records(list);
    }

    /**
     * 提供一个快速构建PageResult的工具
     *
     * @param total   总数
     * @param records 当前页记录集合
     * @param <T>     数据传输对象类型
     * @return 分页结果 PageResult
     */
    public static <T> MybatisPage<T> of(Long total, List<T> records) {
        return new MybatisPage<T>().total(total).records(records);
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }

    public List<T> getRecords() {
        return records;
    }

    public void setRecords(List<T> records) {
        this.records = records;
    }

    public MybatisPage<T> total(Long total) {
        this.total = total;
        return this;
    }

    public MybatisPage<T> records(List<T> records) {
        this.records = records;
        return this;
    }
}
