package com.tanpu.community.util;

import com.tanpu.community.api.beans.req.page.Page;
import com.tanpu.community.api.beans.req.page.Pageable;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: zhoupeng
 * @email: zhoupeng@wealthgrow.cn
 */
public class PageUtils {


    public static <T> Page<T> page(Pageable pageable, List<T> list) {
        if (CollectionUtils.isEmpty(list)) {
            if(pageable==null){
                return new Page<T>(1,0, (long)list.size(),1, list);
            }
            return new Page<T>(pageable, 0L, new ArrayList<>());
        } else {
            if(pageable==null){
                return new Page<T>(1,list.size(), (long)list.size(),1, list);
            }

            // 记录总数
            Integer count = list.size();
            // 页数
            int pageCount;
            if (count % pageable.getPageSize() == 0) {
                pageCount = count / pageable.getPageSize();
            } else {
                pageCount = count / pageable.getPageSize() + 1;
            }
            // 开始索引
            int fromIndex;
            // 结束索引
            int toIndex;

            // 防止索引越界
            if (Integer.valueOf(0).equals(pageable.getPageNumber())) {
                pageable.setPageNumber(1);
            }

            if (!pageable.getPageNumber().equals(pageCount)) {
                fromIndex = (pageable.getPageNumber() - 1) * pageable.getPageSize();
                toIndex = fromIndex + pageable.getPageSize();
            } else {
                fromIndex = (pageable.getPageNumber() - 1) * pageable.getPageSize();
                toIndex = count;
            }
            if (pageable.getPageSize() * (pageable.getPageNumber() - 1) >= list.size()) {
                return new Page<>(pageable, 0L, new ArrayList<>());
            } else {
                Page<T> tPage = new Page<>(pageable, (long) list.size(), new ArrayList<>(list).subList(fromIndex, toIndex));

                int totalPage = list.size() / pageable.getPageSize();
                if (list.size() % pageable.getPageSize() == 0) {
                    tPage.setTotalPages(totalPage);
                } else {
                    tPage.setTotalPages(totalPage + 1);
                }
                return tPage;
            }
        }
    }

    public static <T> Page<T> page(Page<String> o, List<T> list) {
       return new Page<>(o.getPageNum(),o.getPageSize(),o.getTotalSize(),o.getTotalPages(),list);
    }
}