package com.seer.teach.common.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.seer.teach.common.PageListBean;

import java.util.List;
import java.util.function.Function;

/**
 * 分页转换工具类
 * 用于将MyBatis-Plus分页结果转换为目标分页数据结构
 */
public class PageConverterUtils {

    /**
     * 分页数据转换方法
     * 将MyBatis-Plus的IPage分页结果转换为目标分页Bean
     * 使用示例：
     * <code>
     * IPage<GoodsEntity> iPage = goodsService.queryPageList(size, current, goods);
     * PageListBean<GoodsResp> result = PageConverterUtils.convertPageListBean(iPage,  GoodConverter.INSTANCE::list);
     * </code>
     * <p>
     * 通用分页对象转换方法
     *
     * @param sourcePage MyBatis Plus 分页对象
     * @param converter  数据转换函数 (如 GoodConverter.INSTANCE::list)
     * @param <T>        源数据类型
     * @return PageListBean<R> 自定义分页响应对象
     */
    public static <T, R> PageListBean<R> convertPageListBean(
            IPage<T> sourcePage,
            Function<List<T>, List<R>> converter) {
        PageListBean<R> result = new PageListBean<>();
        if (null == sourcePage || sourcePage.getRecords() == null || sourcePage.getRecords().isEmpty()) {
            return result;
        }
        // 应用转换函数
        result.setList(converter.apply(sourcePage.getRecords()));
        result.setPageSize(sourcePage.getSize());
        result.setTotalPage(sourcePage.getPages());
        result.setTotal(sourcePage.getTotal());
        return result;
    }

    /**
     * 分页数据转换方法
     * 将MyBatis-Plus的IPage分页结果转换为目标分页Bean
     * 使用示例：
     * <code>
     * IPage<GoodsEntity> iPage = goodsService.queryPageList(size, current, goods);
     * PageListBean<GoodsResp> result = PageConverterUtils.convertPageList(iPage,  GoodConverter.INSTANCE::one);
     * </code>
     * <p>
     * 通用分页对象转换方法
     * @param sourcePage MyBatis Plus 分页对象
     * @param converter  数据转换函数 (如 GoodConverter.INSTANCE::one)
     * @param <T>        源数据类型
     * @return PageListBean 自定义分页响应对象
     */
    public static <T, R> PageListBean<R> convertPageList(
            IPage<T> sourcePage,
            Function<T, R> converter) {
        PageListBean<R> result = new PageListBean<>();
        if (null == sourcePage || sourcePage.getRecords() == null || sourcePage.getRecords().isEmpty()) {
            return result;
        }
        result.setList(sourcePage.getRecords().stream().map(converter).toList());
        result.setPageSize(sourcePage.getSize());
        result.setTotalPage(sourcePage.getPages());
        result.setTotal(sourcePage.getTotal());
        return result;
    }
}
