package com.sonic.daosupport.converter;

import java.util.function.Function;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.sonic.common.rpc.Page;
import com.google.common.base.CaseFormat;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;

/**
 * 主要用于提供业务Page{@link Page}和<br>
 * mybatisPlus的查询Page{@link com.baomidou.mybatisplus.extension.plugins.pagination.Page}之间的转换
 * @author code
 */
public class PageConverter {
    /**
     * 将mybatisPlus的page，转换成业务定义的Page格式，并对当页数据元素进行转换
     *
     * @param mpPage
     * @param mapper
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> Page<R> convert(IPage<T> mpPage, Function<T, R> mapper) {
        return convert(mpPage.convert(mapper));
    }

    /**
     * 将mybatisPlus的page，转换成业务定义的Page格式
     *
     * @param mpPage
     * @param <R>
     * @return
     */
    public static <R> Page<R> convert(IPage<R> mpPage) {
        Page<R> page = Page.<R>builder()
                .datas(mpPage.getRecords())
                .pn((int) mpPage.getCurrent())
                .ps((int) mpPage.getSize())
                .tc((int) mpPage.getTotal()).build();
        // 业务page参数，仅支持对一列进行排序
        mpPage.orders().stream().findFirst().ifPresent(oi -> {
            page.setSortField(oi.getColumn());
            page.setSortType(oi.isAsc() ? Page.SortType.ASC : Page.SortType.DESC);
        });
        return page;
    }

    /**
     * 构建一个用于查询的IPage
     *
     * @param page
     * @param <T>
     * @return
     */
    public static <T> IPage<T> buildQueryPage(Page<T> page) {
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<T> mpPage
                = new com.baomidou.mybatisplus.extension.plugins.pagination.Page();
        mpPage.setCurrent(page.getPn());
        mpPage.setSize(page.getPs());
        // 处理排序字段
        if (!Strings.isNullOrEmpty(page.getSortField())) {
            String columnName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, page.getSortField());
            OrderItem orderItem = page.getSortType() == Page.SortType.ASC ?
                    OrderItem.asc(columnName) : OrderItem.desc(columnName);
            mpPage.setOrders(ImmutableList.of(orderItem));
        }
        return mpPage;
    }
}
