package top.baogutang.common.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import top.baogutang.common.domain.PageParam;
import top.baogutang.common.domain.PageUtil;

import java.util.List;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

/**
 * @description:
 * @author: nikooh
 * @date: 2024/02/22 : 11:21
 */
@Slf4j
public class MyBatisPlusPageUtil {

    private MyBatisPlusPageUtil() {
        // private constructor
    }

    /**
     * general method of paging query
     *
     * @param queryFunction    page query function
     * @param pageParam        page param
     * @param beanCastFunction bean cast function
     * @param <T>              entity class
     * @param <U>              query parameter
     * @param <R>              return bean
     * @return pageUtils
     */
    public static <T, U extends PageParam, R> PageUtil<R> page(UnaryOperator<Page<T>> queryFunction, U pageParam, Function<T, R> beanCastFunction) {
        Page<T> pageReq = new Page<>(pageParam.getPageNum(), pageParam.getPageSize());
        Page<T> pageRes = queryFunction.apply(pageReq);
        List<R> rPageRes = pageRes.getRecords().stream()
                .map(beanCastFunction)
                .collect(Collectors.toList());
        return new PageUtil<>(pageRes.getCurrent(), pageRes.getSize(), pageRes.getTotal(), pageRes.getPages(), rPageRes);
    }

}
