package jnpf.personnels.service;

import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.base.ActionResult;
import jnpf.base.vo.PageListVO;
import jnpf.model.cultivate.CultivatePage;
import jnpf.model.personnels.dto.base.PersonnelsQueryDTO;
import jnpf.model.personnels.dto.regular.FtbPersonnelsForAppQueryDTO;
import jnpf.model.personnels.dto.turnover.FtbDepUserDTO;
import jnpf.model.personnels.dto.turnover.FtbPersonnelsJobTrialRejectedCreateDTO;
import jnpf.model.personnels.dto.turnover.FtbPersonnelsTurnoverCreateDTO;
import jnpf.model.personnels.dto.turnover.FtbPersonnelsTurnoverDTO;
import jnpf.model.personnels.po.FtbPersonnelsTurnoverManagement;
import jnpf.model.personnels.vo.app.FtbPersonnelsBubbleCountVO;
import jnpf.model.personnels.vo.turnover.FtbPersonnelsTurOrgInfo;
import jnpf.model.personnels.vo.turnover.FtbPersonnelsTurnoverInfoVO;
import jnpf.model.personnels.vo.turnover.FtbPersonnelsTurnoverManagementVO;
import jnpf.permission.vo.v2.user.UserBoundVO;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

public interface FtbPersonnelsTurnoverManagementService extends IService<FtbPersonnelsTurnoverManagement> {
    /**
     * 提交辞职申请
     * @param createDTO 辞职申请的创建数据传输对象
     * @return 返回一个字符串，表示辞职申请的结果或状态
     */
    String applyForResignation(FtbPersonnelsTurnoverCreateDTO createDTO);

    /**
     * 获取离职列表
     * @param dto 查询条件数据传输对象
     * @param page 分页信息
     * @return 返回一个分页列表，包含符合查询条件的离职管理数据传输对象
     */
    PageListVO<FtbPersonnelsTurnoverManagementVO> getTurnoverList(PersonnelsQueryDTO dto, CultivatePage page);

    /**
     * 获取辞职审批流程的详细信息
     * @param id 辞职申请的唯一标识
     * @return 返回一个包含辞职审批流程详细信息的数据传输对象
     */
    FtbPersonnelsTurnoverInfoVO detailsOfResignationApprovalProcess(String id);

    /**
     * 撤回辞职申请
     *
     * @param id     辞职申请的唯一标识
     * @param taskId
     */
    void withdrawResignationApplication(String id, String taskId);

    /**
     * 审核辞职申请
     * @param auditDto 审核辞职申请的数据传输对象
     * @return 返回一个字符串，表示审核的结果或状态
     */
    String reviewResignationApplication(FtbPersonnelsTurnoverDTO auditDto);

    /**
     * 获取待审批的离职列表
     * @param dto 查询条件数据传输对象
     * @param page 分页信息
     * @return 返回一个分页列表，包含待审批的离职数据传输对象
     */
    PageListVO<FtbPersonnelsTurnoverManagementVO> getTurnoverForList(FtbPersonnelsForAppQueryDTO dto, CultivatePage page);

    /**
     * 辞职后定期关闭用户账号
     * @param tenantId 租户ID
     */
    void closeUserAccountRegularlyAfterResignation(String tenantId);

    /**
     * 获取用户绑定的审批信息
     * @param flag 标识
     * @param userId 用户ID
     * @return 返回一个包含用户绑定审批信息的列表
     */
    List<Map<String, Object>> getUserBoundApproval(String flag, String userId);

    /**
     * 获取列表数量
     * @param flag 标识
     * @return 返回一个包含列表数量的数据传输对象
     */
    FtbPersonnelsBubbleCountVO getListCont(String flag);

    /**
     * 试岗驳回创建离职数据清除账号信息
     * @param createDTO 试岗驳回创建数据传输对象
     */
    void jobTrialRejected(FtbPersonnelsJobTrialRejectedCreateDTO createDTO);

    /**
     * 删除离职申请
     * @param userIds 用户ID列表
     */
    void deleteResignationApplication(List<String> userIds);

    /**
     * 删除离职申请
     * @param ids 主键ID列表
     */
    void deleteResignationApplicationWithId(List<String> ids);

    /**
     * 检查用户是否已签订离职协议（已废弃）
     * @param userId 用户ID
     * @param flag 标识
     * @return 返回一个布尔值，表示用户是否已签订离职协议
     */
    @Deprecated(since = "人事v1.3废弃")
    Boolean userHasSignedASeparationAgreement(String userId,Integer flag);

    /**
     * 辞职前检查
     * @param userId 用户ID
     * @param taskFlag 任务标识
     * @param whetherItPassesOrNot 是否通过的标志
     * @return 返回一个空操作的结果动作对象
     */
    ActionResult<Void> resignationPreCheck(String userId,String taskFlag,String... whetherItPassesOrNot);

    /**
     * 提交辞职申请到OA系统
     * @param createDTO 辞职申请的创建数据传输对象
     * @return 返回一个空操作的结果动作对象
     */
    ActionResult<Void> applyForResignatioForOA(FtbPersonnelsTurnoverCreateDTO createDTO);

    /**
     * 在OA系统中审核辞职申请
     * @param auditDto 审核辞职申请的数据传输对象
     * @return 返回一个空操作的结果动作对象
     */
    ActionResult<Void> reviewResignationApplicationWithOA(FtbPersonnelsTurnoverDTO auditDto);

    List<FtbPersonnelsTurnoverManagementVO> queryTurnoverList();

    List<FtbPersonnelsTurnoverManagementVO> queryTurnoverList(List<String> userIds);

    void getTurnoverListExport(PersonnelsQueryDTO dto, HttpServletResponse response) throws IOException;

    FtbPersonnelsTurOrgInfo getUserOrganizeInfo(String userId, String phone);

    List<UserBoundVO> getInformationAboutTheDepartingPerson(FtbDepUserDTO dto);
}
