package jnpf.attendance.service;

import jnpf.base.service.SuperService;
import jnpf.entity.AttendanceGroup;
import jnpf.entity.attendance.AttendanceShiftSettingEntity;
import jnpf.exception.HandleException;
import jnpf.model.attendance.dto.AttendanceShiftDto;
import jnpf.model.attendance.vo.AttendanceShiftSettingVo;
import jnpf.model.attendance.vo.ShiftPeriodVo;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 考勤组配置-考勤配置 服务类
 * </p>
 *
 * @author ahua
 * @since 2023-11-22
 */
public interface AttendanceShiftSettingService extends SuperService<AttendanceShiftSettingEntity> {

    /**
     * 根据考勤组ID和考勤组视图列表获取启用的班次设置信息。
     *
     * @param groupIds 考勤组ID列表
     * @param attendanceGroupVos      考勤组视图对象列表
     * @return 启用的班次设置信息映射
     */
    Map<String, AttendanceShiftSettingVo> getEnableShiftSetting(List<String> groupIds, List<AttendanceGroup> attendanceGroupVos);

    /**
     * 初始化班次设置。
     *
     * @param groupId 考勤组ID
     */
    void initShiftSetting(String groupId);

    /**
     * 根据考勤组ID获取所有班次设置。
     *
     * @param groupId 考勤组ID
     * @return 班次设置视图对象
     */
    AttendanceShiftSettingVo findAllByGroupId(String groupId);

    /**
     * 根据考勤组ID获取单个班次设置。
     *
     * @param groupId 考勤组ID
     * @return 班次设置视图对象
     */
    AttendanceShiftSettingVo findByGroupId(String groupId);

    /**
     * 保存班次设置信息。
     *
     * @param dto 班次设置数据传输对象
     * @throws HandleException 处理异常
     */
    void save(AttendanceShiftDto dto) throws HandleException;

    /**
     * 更改系统类型。
     *
     * @param groupId 考勤组ID
     * @param systemType 系统类型
     */
    void changeSystemType(String groupId, Integer systemType);

    /**
     * 删除指定的班次周期。
     *
     * @param periodId 班次周期ID
     */
    void delPeriod(String periodId);

    /**
     * 更改班次设置的启用状态。
     *
     * @param groupId 考勤组ID
     * @param enable  启用状态（0禁用，1启用）
     * @param byGroupId      班次设置视图对象
     */
    void changeStatus(String groupId, Integer enable, AttendanceShiftSettingVo byGroupId);

    /**
     * 根据考勤组ID获取班次周期列表。
     *
     * @param groupId 考勤组ID
     * @return 班次周期视图对象列表
     */
    List<ShiftPeriodVo> periodList(String groupId);

    /**
     * 智能排班专用：便于区分 §6.1（未取得班次定义）与 §6.2（已取得定义但班次列表为空）。
     *
     * @return {@code null} — 未取得该考勤组启用班次设置（与「占位空列表」不同）；{@link Collections#emptyList()} —
     *     已取得设置但未配置班次周期；否则为周期列表。
     */
    List<ShiftPeriodVo> periodListForIntelligentSchedule(String groupId);

    /**
     * 自我排班的班次列表
     *
     * @return 班次周期视图对象列表
     */
    List<ShiftPeriodVo> periodListForSelfScheduling();

    void hisShiftSetting(Map<String, String> group2orgMap, Map<String, String> org2GroupMap);
}
