package com.ankaibei.workFlow.webadmin.ankaibei.utils;

import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

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

/**
 * @author smartcyl
 */
public interface ApiMixin<Vo, ID> {
    /**
     * 通用查询
     *
     * @param vo 条件参数
     * @return List<T>
     */
    default List<Vo> getList(Vo vo) {
        return null;
    }

    /**
     * 通用查询
     *
     * @return List<T>
     */
    default List<Vo> getList() {
        return null;
    }

    /**
     * 通用查询
     *
     * @param var1 id
     * @return List<T>
     */
    default List<Vo> getList(Iterable<ID> var1) {
        return null;
    }

    /**
     * 通用查询
     *
     * @param id 条件参数
     * @return List<T>
     */
    default Vo getById(ID id) {
        return null;
    }

    /**
     * 分页查询
     *
     * @param pageSize  分页条数
     * @param pageIndex 页码
     * @param vo        返回的实体
     * @return ResMsg<Vo>
     */
    default ResMsg<String> getListByPage(Integer pageSize, Integer pageIndex, Vo vo) {
        return null;
    }

    /**
     * 分页查询
     *
     * @param pageSize  分页条数
     * @param pageIndex 页码
     * @return ResMsg<Vo>
     */
    default ResMsg<String> getListByPage(Integer pageSize, Integer pageIndex) {
        return null;
    }

    /**
     * 单个信息查询
     *
     * @param vo 返回的实体
     * @return Vo
     */
    default Vo getInfo(Vo vo) {
        return null;
    }

    /**
     * 新增
     *
     * @param vo 实体
     * @return boolean
     */
    default Vo addInfo(Vo vo) {
        return null;
    }

    /**
     * 删除
     *
     * @param vo 实体
     * @return boolean
     */
    default boolean deleteInfo(Vo vo) {
        return false;
    }

    default boolean deleteById(ID id) {
        return false;
    }

    /**
     * 批量删除
     *
     * @param vos 实体
     * @return boolean
     */
    default boolean deleteBatch(List<Vo> vos) {
        return false;
    }

    /**
     * 批量新增
     *
     * @param vos 实体
     * @return boolean
     */
    default boolean saveBatch(List<Vo> vos) {
        return false;
    }

    /**
     * 新增
     *
     * @param vo 实体
     * @return boolean
     */
    default boolean updateInfo(Vo vo) {
        return false;
    }

    /**
     * 通用的属性拷贝方法
     *
     * @param rList  来源
     * @param zClass 目的
     * @param <T>    来源实体
     * @param <Z>    目的实体
     * @return List<Z>
     */
    default <T, Z> List<Z> copyProperties(List<T> rList, Class<Z> zClass) {
        List<Z> zList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(rList)) {
            rList.forEach(t -> {
                Z z = null;
                try {
                    z = zClass.newInstance();
                } catch (InstantiationException | IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (z != null) {
                    BeanUtils.copyProperties(t, z);
                    zList.add(z);
                }
            });
        }
        return zList;
    }

    /**
     * 通用的属性拷贝方法
     *
     * @param t      来源
     * @param zClass 目标类
     * @return Z
     */
    default <T, Z> Z copyProperties(T t, Class<Z> zClass) {
        Z z = null;
        try {
            z = zClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        if (z != null) {
            BeanUtils.copyProperties(t, z);
        }
        return z;
    }
}
