package com.sundot.airport.exam.common.service;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.sundot.airport.exam.common.BasePageParam;
import com.sundot.airport.exam.common.model.BaseEntity;

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * <b>功能名: </b>BaseService<br>
 * <b>说明: </b> 通用的增删改查操作。T：实体<br>
 * <b>著作权: </b> Copyright (C) 2021 HUIFANEDU  CORPORATION<br>
 * <b>修改履历: </b><br>
 *
 * @author 2021/6/18 liangxiao
 */
public interface BaseService<T extends BaseEntity> extends IService<T> {

    /**
     * <b>方法名: </b> setServiceId <br>
     * <b>说明: </b> 设置业务主键id <br>
     *
     * @param entity com.huifanedu.cschool.entity 实体对象
     * @return void<br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    void setServiceId(T entity);

    /**
     * <b>方法名: </b> delete <br>
     * <b>说明: </b> 删除数据 <br>
     *
     * @param serviceId java.lang.String 业务id
     * @return boolean<br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    boolean delete(String serviceId);

    /**
     * <b>方法名: </b> delete <br>
     * <b>说明: </b> 批量删除数据 <br>
     *
     * @param serviceIds java.util.List<java.lang.String> 业务id列表
     * @return boolean<br>
     * <b>修改履历: </b>
     * @author 2021/6/21 liangxiao
     */
    boolean deleteList(List<String> serviceIds);

    /**
     * <b>方法名: </b> update <br>
     * <b>说明: </b> 更新数据 <br>
     *
     * @param entity com.huifanedu.cschool.entity 实体对象
     * @return boolean<br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    boolean update(T entity);

    /**
     * <b>方法名: </b> get <br>
     * <b>说明: </b> 获取一条记录 <br>
     *
     * @param serviceId java.lang.String 业务id
     * @return java.util.Optional<com.huifanedu.cschool.entity> 实体对象
     * <b>修改履历: </b>
     * @author 2021-06-17 liangxiao
     */
    Optional<T> get(String serviceId);

    /**
     * <b>方法名: </b> insertOne <br>
     * <b>说明: </b> 插入一条数据，并自动生成一条业务id <br>
     *
     * @param entity com.huifanedu.cschool.entity 实体对象
     * @return java.util.Optional<T><br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default Optional<T> insert(T entity) {
        // 生成业务ID
        setServiceId(entity);
        return this.save(entity) ? Optional.of(entity) : Optional.empty();
    }

    /**
     * <b>方法名: </b> insertWithoutServiceId <br>
     * <b>说明: </b> 插入一条数据，不生成一条业务id <br>
     *
     * @param entity com.huifanedu.cschool.entity 实体对象
     * @return java.util.Optional<T><br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default Optional<T> insertWithoutServiceId(T entity) {
        return this.save(entity) ? Optional.of(entity) : Optional.empty();
    }

    /**
     * <b>方法名: </b> insertList <br>
     * <b>说明: </b> 批量插入条数据，会自动生成业务id <br>
     *
     * @param list java.util.List 新增参数列表
     * @return java.util.List<T><br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default List<T> insertList(List<T> list) {
        // 生成业务ID
        List<T> collect = list
                .stream()
                .peek(this::setServiceId)
                .collect(Collectors.toList());
        return this.saveBatch(collect) ? collect : Collections.emptyList();
    }

    /**
     * <b>方法名: </b> findList <br>
     * <b>说明: </b> 查询全部数据 <br>
     *
     * @return java.util.List<T><br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default List<T> findList() {
        return this.list();
    }

    /**
     * <b>方法名: </b> queryList <br>
     * <b>说明: </b> 根据条件查询列表 <br>
     *
     * @param queryWrapper com.baomidou.mybatisplus.core.conditions.Wrapper 查询条件
     * @return java.util.List<T><br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default List<T> queryList(Wrapper<T> queryWrapper) {
        return this.list(queryWrapper);
    }

    /**
     * <b>方法名: </b> queryPageList <br>
     * <b>说明: </b>  <br>
     *
     * @param param        com.huifanedu.kernel.model.pager.BasePageParam 分页参数
     * @param queryWrapper com.baomidou.mybatisplus.core.conditions.Wrapper 查询条件
     * @return com.github.pagehelper.PageInfo<T><br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default PageInfo<T> queryPageList(BasePageParam param, Wrapper<T> queryWrapper) {
        // 分页信息初始化
        param.initPageInfo();

        // 根据参数查询列表
        List<T> list = this.list(queryWrapper);
        // 判断结果是否为空
        list = CollectionUtil.isNotEmpty(list) ? list : Collections.emptyList();
        return new PageInfo<>(list);
    }

    /**
     * <b>方法名: </b> allCount <br>
     * <b>说明: </b> 统计记录数（全部） <br>
     *
     * @return int<br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default long allCount() {
        return count();
    }

    /**
     * <b>方法名: </b> queryCount <br>
     * <b>说明: </b> 统计记录数（查询条件） <br>
     *
     * @param queryWrapper com.baomidou.mybatisplus.core.conditions.Wrapper 查询条件
     * @return int<br>
     * <b>修改履历: </b>
     * @author 2021/6/18 liangxiao
     */
    default long queryCount(Wrapper<T> queryWrapper) {
        return count(queryWrapper);
    }
}
