package jnpf.attendance.service;

import com.github.pagehelper.PageInfo;
import jnpf.base.service.SuperService;
import jnpf.entity.attendance.AttendanceBookConfigEntity;
import jnpf.exception.HandleException;
import jnpf.model.attendance.dto.AttendanceBookConfigAddUserDto;
import jnpf.model.attendance.dto.AttendanceBookConfigDto;
import jnpf.model.attendance.dto.AttendanceBookConfigQueryDto;
import jnpf.model.attendance.dto.GetValidUsersDto;
import jnpf.model.attendance.vo.AttendanceBookConfigVo;
import jnpf.model.attendance.vo.AttendanceResultOptionGroupVo;
import jnpf.model.attendance.vo.AttendanceResultOptionVo;
import jnpf.model.attendance.vo.BookConfigCreatorVo;
import jnpf.model.attendance.vo.BookPersonnelVo;
import jnpf.permission.model.user.PartUserInfoVo;

import java.util.List;

/**
 * 考勤本配置服务接口
 *
 * @author Generated
 * @create 2026-04-15
 */
public interface AttendanceBookConfigService extends SuperService<AttendanceBookConfigEntity> {

    /**
     * 新增或更新考勤本配置
     * <p>根据DTO中的id判断：id为空则新增，id不为空则更新</p>
     *
     * @param configDto 考勤本配置DTO
     * @throws HandleException 业务异常
     */
    void saveOrUpdateAttendanceBookConfig(AttendanceBookConfigDto configDto) throws HandleException;

    /**
     * 删除考勤本配置
     *
     * @param id 考勤本ID
     */
    void deleteAttendanceBookConfig(String id);

    /**
     * 更新启用状态
     *
     * @param id 考勤本ID
     * @throws HandleException 业务异常
     */
    void updateEnableStatus(String id) throws HandleException;

    /**
     * 获取考勤本配置详情
     *
     * @param id 考勤本ID
     * @return 考勤本配置VO
     */
    AttendanceBookConfigVo getDetail(String id);

    /**
     * 分页查询考勤本配置列表
     *
     * @param queryDto 查询条件
     * @return 分页结果
     */
    PageInfo<AttendanceBookConfigVo> getPageList(AttendanceBookConfigQueryDto queryDto);

    /**
     * 增量添加使用范围人员
     * <p>向指定考勤本配置的使用范围中增量添加用户列表</p>
     *
     * @param addUserDto 添加用户DTO
     * @throws HandleException 业务异常
     */
    void addScopeUsers(AttendanceBookConfigAddUserDto addUserDto) throws HandleException;

    /**
     * 判断当前登录人是否为考勤本负责人
     *
     * @param bookConfigId 考勤本配置ID
     * @return true-是负责人，false-不是负责人
     * @throws HandleException 业务异常
     */
    boolean isCurrentUserManager(String bookConfigId) throws HandleException;

    /**
     * 获取指定组织集合及用户集合在当前时间下的所有涉及用户
     * <p>查询这些组织和用户在当前时间的有效用户集合，返回完整的用户信息列表</p>
     *
     * @param dto 查询参数（组织ID列表、用户ID列表）
     * @return 有效用户信息列表
     */
    List<PartUserInfoVo> getValidUsers(GetValidUsersDto dto);

    /**
     * app-获取考勤结果下拉列表（分组返回）
     * <p>根据考勤本配置返回可用的考勤状态选项，包括基础考勤状态、外勤结果和该考勤本配置的请假类型</p>
     *
     * @param bookConfigId 考勤本配置ID
     * @return 考勤结果选项分组（考勤结果、外勤结果、假期类型）
     * @throws HandleException 业务异常
     */
    AttendanceResultOptionGroupVo getAttendanceResultOptions(String bookConfigId) throws HandleException;

    /**
     * 需求2：获取考勤本配置创建人列表
     *
     * @return 创建人列表
     */
    List<BookConfigCreatorVo> getCreatorList();

    /**
     * 需求3：获取考勤本配置人员列表
     *
     * @param bookConfigId 考勤本配置ID
     * @return 人员列表
     */
    List<BookPersonnelVo> getBookPersonnelList(String bookConfigId,String month);
}
