package com.ym.mec.common.page;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ym.mec.common.tenant.TenantContextHolder;

import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BiConsumer;

/**
 * @author hgw
 * Created by 2021-12-03
 */
public class PageUtil {
    /**
     * 获取mybatisPlus的分页模型
     *
     * @param page 页数
     * @param rows 查询数
     * @param <T>  返回的类
     */
    public static <T> Page<T> getPage(Integer page, Integer rows) {
        Integer pageIndex = Optional.ofNullable(page).orElse(1);
        Integer pageSize = Optional.ofNullable(rows).orElse(20);
        return new Page<T>(pageIndex, pageSize);
    }

    /**
     * 将mybatisPlus的分页模型 转换为本项目的分页模型
     *
     * @param source  mybatisPlus的分页模型
     * @param <T>返回的类
     */
    public static <T> PageInfo<T> pageInfo(IPage<T> source) {
        if (Objects.isNull(source)) {
            return new PageInfo<>(1, 20);
        }
        int total = Integer.parseInt(String.valueOf(source.getTotal()));
        int limit = Integer.parseInt(String.valueOf(source.getSize()));
        PageInfo<T> resultPage = new PageInfo<>();
        resultPage.setRows(source.getRecords());
        resultPage.setPageNo(Long.valueOf(source.getCurrent()).intValue());
        resultPage.setLimit(limit);
        resultPage.setTotal(total);
        return resultPage;
    }

    /**
     * 分页有需要拼接时分秒要求的可以使用这个方法
     */
    public static <T> Page<T> concatTimePage(Map<String, Object> param, String startTime, String endTime) {
        Page<T> pageInfo = PageUtil.getPageInfo(param);
        BiConsumer<String, String> addTimeCons = (key, time) -> Optional.ofNullable(param.get(key)).map(String::valueOf)
                .ifPresent(date -> param.put(key, date + " " + time));
        addTimeCons.accept(startTime, "00:00:00");
        addTimeCons.accept(endTime, "23:59:59");
        return pageInfo;
    }

    /**
     * 获取Map中的关键字获取分页数据
     *
     * @param param Map<String, Object> param
     * @param str   关键字
     * @return Optional
     */
    public static <O> Optional<Integer> getPage(Map<String, O> param, String str) {
        return Optional.ofNullable(param)
                .map(p -> p.get(str))
                .map(String::valueOf)
                .map(Integer::valueOf);
    }

    public static <O, T> Page<T> getPageInfo(Map<String, O> param) {
        int pageSize = getPage(param, "rows").orElse(20);
        int pageIndex = getPage(param, "page").orElse(1);
        return new Page<>(pageIndex, pageSize);
    }

}
