package com.bohuikeji.delivery.backstage.entity.open;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bohuikeji.delivery.backstage.entity.open.vo.PageVo;
import com.bohuikeji.frame.module.admin.base.SuperBase;
import org.springframework.beans.BeanUtils;

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

/**
 * 开放平台VO对象父类
 * @author 孙劲辉
 */
public class VoBase<T extends VoBase<T>> extends SuperBase {

    /**
     * 静态方法，拷贝对象属性到VO，自动创建Vo对象
     * @param source 源对象
     * @param voClass VO对象类
     * @param <T> 返回拷贝后的对象
     * @return
     */
    public static <T> T copy(Object source,Class<T> voClass){
        try {
            T vo= voClass.newInstance();
            BeanUtils.copyProperties(source,vo);
            return vo;
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 静态方法 ，用于拷贝mp分页的分页对象，同时将内部的数据库实体转换为VO实体
     * @param page
     * @param voClass
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T,E extends VoBase<E>> PageVo<E> pageCopy(IPage<T> page,Class<E> voClass){
        PageVo<E> pageVo=new PageVo<>();
        pageVo.setSize(page.getSize());
        pageVo.setPages(page.getPages());
        pageVo.setTotal(page.getTotal());
        pageVo.setCurrent(page.getCurrent());
        List<E> voList=new ArrayList<E>();
        page.getRecords().forEach(dbo->{
            voList.add(VoBase.copy(dbo,voClass));
        });
        pageVo.setList(voList);
        return pageVo;
    }


    /**
     * 拷贝对象属性值到本对象
     * @param source
     * @return
     */
    public T copy(Object source){
        BeanUtils.copyProperties(source,this);
        return (T)this;
    }
}
