package com.sundot.airport.attendance.service;

import com.sundot.airport.attendance.domain.AttendancePostRecord;
import com.sundot.airport.common.core.domain.entity.SysUser;
import com.sundot.airport.common.dto.AttendanceWorkDurationDto;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 上岗记录Service接口
 *
 * @author wangchong
 * @date 2025-07-10
 */
public interface IAttendancePostRecordService {
    /**
     * 查询上岗记录
     *
     * @param id 上岗记录主键
     * @return 上岗记录
     */
    public AttendancePostRecord selectAttendancePostRecordById(Long id);

    /**
     * 查询上岗记录列表
     *
     * @param attendancePostRecord 上岗记录
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectAttendancePostRecordList(AttendancePostRecord attendancePostRecord);

    /**
     * 新增上岗记录
     *
     * @param attendancePostRecord 上岗记录
     * @return 结果
     */
    public int insertAttendancePostRecord(AttendancePostRecord attendancePostRecord);

    /**
     * 修改上岗记录
     *
     * @param attendancePostRecord 上岗记录
     * @return 结果
     */
    public int updateAttendancePostRecord(AttendancePostRecord attendancePostRecord);

    /**
     * 批量删除上岗记录
     *
     * @param ids 需要删除的上岗记录主键集合
     * @return 结果
     */
    public int deleteAttendancePostRecordByIds(Long[] ids);

    /**
     * 删除上岗记录信息
     *
     * @param id 上岗记录主键
     * @return 结果
     */
    public int deleteAttendancePostRecordById(Long id);

    /**
     * 查询指定用户当天的上岗记录
     *
     * @param createBy 创建人
     * @param userId   用户ID
     * @param today    当天日期
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectTodayRecordsByUserId(Long createBy, Long userId, Date today, String locked);

    /**
     * 查询指定班次代码当天的上岗记录
     *
     * @param today      当天日期
     * @param shiftCodes 班次代码列表
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectTodayRecordsByShiftCodes(Date today, List<String> shiftCodes);

    /**
     * 根据指定时间获取用户的在岗位置信息
     *
     * @param userId    用户ID
     * @param queryTime 查询时间
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectLocationsByTime(Long userId, Date queryTime);

    /**
     * 根据指定时间获取指定通道的在岗位置信息
     *
     * @param channelCodeList 通道code
     * @return 上岗记录集合
     */
    List<AttendancePostRecord> selectLocationsByTimeAndChannelName(List<String> channelCodeList, Date nowDate, Date startTime, Date endTime);

    /**
     * 查询指定班次代码当天的下岗记录
     *
     * @param today
     * @param shiftCodes
     * @return
     */
    public List<AttendancePostRecord> selectCheckOutTimeByShiftCodes(Date today, List<Long> shiftCodes);

    /**
     * 获取当前时间下科长的在岗区域
     *
     * @return 区域集合
     */
    List<AttendancePostRecord> selectKezhangRecordCount(Long userId, Date startTime, Date endTime);

    /**
     * 获取当前时间下指定用户最后的在岗时间
     *
     * @param userId 用户ID
     * @return 最后的在岗时间
     */
    List<AttendancePostRecord> queryLastTime(Long userId);

    /**
     * 获取当前班次下科长上岗的id
     *
     * @return
     */
    List<Long> queryKeIds();

    /**
     * 查询当前班组下所有在岗记录
     */
    List<AttendancePostRecord> selectTeamOnList(Date date, Long attendanceTeamId);

    /**
     * 获取当前班次时间
     *
     * @return 时间
     */
    Map<String, Date> getShiftTime();

    /**
     * 获取当前班次时间
     *
     * @return 时间
     */
    Map<String, Date> getShiftTimeNew();

    /**
     * 查询指定用户最近的上岗记录的考勤日期
     *
     * @param createBy 创建人
     * @param userId   用户ID
     * @return 考勤日期
     */
    public Date selectMaxDateByUserId(Long createBy, Long userId);

    /**
     * 查询指定个人在指定时间段内的总工作时长
     *
     * @param userId    用户ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 个人总工作时长（分钟）
     */
    BigDecimal selectPersonalTotalWorkDurationInTimeRange(Long userId, Date startTime, Date endTime);

    /**
     * 查询站级别指定时间段内工作时长总和最高的时长
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 在岗记录列表
     */
    BigDecimal selectTopUserWorkDurationInTimeRange(Long userId, Date startTime, Date endTime);

    /**
     * 根据角色标识查询今日上岗用户列表
     *
     * @param date 考勤日期
     * @param list 角色标识
     * @return 用户列表
     */
    public List<SysUser> selectUserListByRoleKey(Date date, List<String> list);

    /**
     * 查询指定用户ID列表在指定时间段内的总工作时长
     *
     * @param list      用户ID列表
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 总工作时长（分钟）
     */
    BigDecimal selectTotalWorkDurationInTimeRange(List<Long> list, Date startTime, Date endTime);

    /**
     * 批量查询多个用户在指定时间段内的总工作时长
     *
     * @param userIds   用户ID列表
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 工作时长DTO列表
     */
    List<AttendanceWorkDurationDto> selectBatchPersonalTotalWorkDurationInTimeRange(List<Long> userIds, Date startTime, Date endTime);
}
