package cn.iocoder.yudao.module.system.service.laborcontract;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborContractPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborContractRespVO;
import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborContractSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.laborcontract.LaborContractDO;

import javax.validation.Valid;
import java.time.LocalDate;
import java.util.List;

/**
 * 劳动合同管理 Service 接口
 *
 * @author 符溶馨
 */
public interface LaborContractService {

    /**
     * 创建劳动合同管理
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createLaborContract(@Valid LaborContractSaveReqVO createReqVO);

    /**
     * 更新劳动合同管理
     *
     * @param updateReqVO 更新信息
     */
    void updateLaborContract(@Valid LaborContractSaveReqVO updateReqVO);

    /**
     * 批量更新合同状态
     *
     * @param ids    主键列表
     * @param status 状态
     */
    void updateLaborContractList(List<Long> ids, Integer status);

    /**
     * 删除劳动合同管理
     *
     * @param id 编号
     */
    void deleteLaborContract(Long id);

    /**
     * 获得劳动合同管理
     *
     * @param id 编号
     * @return 劳动合同管理
     */
    LaborContractDO getLaborContract(Long id);

    /**
     * 获得劳动合同管理分页
     *
     * @param pageReqVO 分页查询
     * @return 劳动合同管理分页
     */
    PageResult<LaborContractRespVO> getLaborContractPage(LaborContractPageReqVO pageReqVO);

    /**
     * 获得用户历史签约信息
     *
     * @param userId 用户编号
     * @return 合同信息列表
     */
    List<LaborContractDO> getHistoryList(Long userId);

    /**
     * 获得指定用户的签约信息列表
     *
     * @param userIds 用户编号列表
     * @return 签约信息列表
     */
    List<LaborContractDO> getListByUserIds(List<Long> userIds);

    /**
     * 获得 到期日期小于指定日期的合同列表
     *
     * @param now 日期
     * @return 合同列表
     */
    List<LaborContractDO> getListByEndTime(LocalDate now);

    /**
     * 获得当前登录用户的入职时间和转正时间
     *
     * @param userId 用户编号
     * @return 日期
     */
    LaborContractDO getSigningDate(Long userId);

    /**
     * 获取用户最早合同
     *
     * @param userId
     * @return
     */
    LaborContractDO getTheEarliestContract(Long userId);

    /**
     * 获取指定日期内即将转正的人员
     *
     * @param remindDate 日期
     * @return 合同列表
     */
    List<LaborContractDO> getListByRemindDate(LocalDate remindDate);
}
