package jnpf.attendance.service;

import com.github.pagehelper.PageInfo;
import jnpf.base.service.SuperService;
import jnpf.entity.Workstation;
import jnpf.model.attendance.dto.WorkstationQueryDto;
import jnpf.model.attendance.dto.WorkstationSaveDto;
import jnpf.model.attendance.dto.WorkstationUserAddDto;
import jnpf.model.attendance.dto.WorkstationUserRemoveDto;
import jnpf.model.attendance.vo.WorkstationDetailVo;
import jnpf.model.attendance.vo.WorkstationVo;
import jnpf.model.attendance.vo.WorkstationWithUsersVo;

import java.util.Date;
import java.util.List;

/**
 * 考勤工作站服务
 *
 * @author AI Generated
 * @create 2026-05-11
 */
public interface WorkstationService extends SuperService<Workstation> {

    /**
     * 新增工作站
     *
     * @param dto 工作站保存DTO
     */
    void saveWorkstation(WorkstationSaveDto dto);

    /**
     * 编辑工作站
     *
     * @param id  工作站ID
     * @param dto 工作站保存DTO
     */
    void updateWorkstation(String id, WorkstationSaveDto dto);

    /**
     * 删除工作站
     *
     * @param id 工作站ID
     */
    void deleteWorkstation(String id);

    /**
     * 查询工作站列表(分页)
     *
     * @param dto 查询条件(含分页参数)
     * @return 工作站分页列表
     */
    PageInfo<WorkstationVo> listWorkstations(WorkstationQueryDto dto);

    /**
     * 添加人员
     *
     * @param dto 添加人员DTO
     */
    void addUsers(WorkstationUserAddDto dto);

    /**
     * 删除人员
     *
     * @param dto 删除人员DTO
     */
    void removeUser(WorkstationUserRemoveDto dto);

    /**
     * 查询工作站详情
     *
     * @param id      工作站ID
     * @return 工作站详情
     */
    WorkstationDetailVo getDetail(String id);

    /**
     * 按考勤组查询工作站及其归属员工列表
     * <p>
     * 工作站归属：考勤组的所属门店（{@code orgId}）下所有未删除的工作站；
     * 工作站员工：考勤组成员通过
     * {@code AttendanceUserService#getAttendanceGroupUsersOfSecondment} 拉取（截止 {@code endTime}、含借调过滤），
     * 主岗位与工作站岗位一致的自动归属（{@code isExtra=false}），
     * 工作站-人员关联表中显式额外加入的为另加入员工（{@code isExtra=true}）。
     * 每人附带 {@code inGroupDays}（{@code [startTime, endTime]} 内在组日）及 {@code canLineSchedule}。
     *
     * @param groupId   考勤组ID
     * @param startTime 查询开始时间（含）
     * @param endTime   查询结束时间（含）；同时作为成员快照截止时刻
     * @return 工作站列表，每个元素包含工作站属性及其员工列表
     */
    List<WorkstationWithUsersVo> listWorkstationsByGroupId(String groupId, Date startTime, Date endTime);

    /**
     * 重置指定工作站人员：仅保留主岗位与工作站岗位一致的默认归属，清除另加入的额外人员。
     *
     * @param workstationId 工作站ID
     */
    void resetWorkstationUsers(String workstationId);
}
