package com.haha.common.vo;

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 分页响应结果
 * 统一的分页数据返回格式
 *
 * @param <T> 数据类型
 */
@Data
public class PageResult<T> implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 数据列表
     */
    private List<T> list;
    
    /**
     * 总记录数
     */
    private long total;
    
    /**
     * 每页条数
     */
    private long pageSize;
    
    /**
     * 当前页码
     */
    private long currentPage;
    
    /**
     * 总页数
     */
    private long totalPages;

    public PageResult() {
    }

    public PageResult(List<T> list, long total, long pageSize, long currentPage) {
        this.list = list;
        this.total = total;
        this.pageSize = pageSize;
        this.currentPage = currentPage;
        this.totalPages = pageSize > 0 ? (total + pageSize - 1) / pageSize : 0;
    }

    /**
     * 从MyBatis-Plus的IPage转换
     *
     * @param page IPage对象
     * @param <T>  数据类型
     * @return PageResult
     */
    public static <T> PageResult<T> of(IPage<T> page) {
        PageResult<T> result = new PageResult<>();
        result.setList(page.getRecords());
        result.setTotal(page.getTotal());
        result.setPageSize(page.getSize());
        result.setCurrentPage(page.getCurrent());
        result.setTotalPages(page.getPages());
        return result;
    }

    /**
     * 从MyBatis-Plus的IPage转换（带数据转换）
     *
     * @param page   IPage对象
     * @param mapper 数据转换函数
     * @param <T>    原始数据类型
     * @param <R>    转换后数据类型
     * @return PageResult
     */
    public static <T, R> PageResult<R> of(IPage<T> page, java.util.function.Function<T, R> mapper) {
        PageResult<R> result = new PageResult<>();
        result.setList(page.getRecords().stream().map(mapper).toList());
        result.setTotal(page.getTotal());
        result.setPageSize(page.getSize());
        result.setCurrentPage(page.getCurrent());
        result.setTotalPages(page.getPages());
        return result;
    }
}
