package com.sundot.airport.attendance.service;

import com.sundot.airport.attendance.domain.AttendanceCheckRecord;
import com.sundot.airport.attendance.domain.AttendanceRecord;
import com.sundot.airport.common.core.domain.entity.SysUser;
import com.sundot.airport.common.dto.AttendanceRecordDTO;
import com.sundot.airport.common.dto.AttendanceRecordRep;
import com.sundot.airport.common.dto.AttendanceRecordReq;
import com.sundot.airport.common.dto.UserInfo;

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

/**
 * 考勤记录Service接口
 *
 * @author wangchong
 * @date 2025-07-10
 */
public interface IAttendanceRecordService {
    /**
     * 查询考勤记录
     *
     * @param id 考勤记录主键
     * @return 考勤记录
     */
    public AttendanceRecord selectAttendanceRecordById(Long id);

    /**
     * 查询考勤记录列表
     *
     * @param attendanceRecord 考勤记录
     * @return 考勤记录集合
     */
    public List<AttendanceRecord> selectAttendanceRecordList(AttendanceRecord attendanceRecord);

    /**
     * 新增考勤记录
     *
     * @param attendanceRecord 考勤记录
     * @return 结果
     */
    public int insertAttendanceRecord(AttendanceRecord attendanceRecord);

    /**
     * 修改考勤记录
     *
     * @param attendanceRecord 考勤记录
     * @return 结果
     */
    public int updateAttendanceRecord(AttendanceRecord attendanceRecord);

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

    /**
     * 删除考勤记录信息
     *
     * @param id 考勤记录主键
     * @return 结果
     */
    public int deleteAttendanceRecordById(Long id);

    /**
     * 打卡签到
     *
     * @param dto      打卡信息
     * @param userInfo 登录用户
     * @return 今日打卡历史
     */
    List<AttendanceCheckRecord> record(AttendanceRecordDTO dto, UserInfo userInfo);

    /**
     * 获取打卡记录
     *
     * @param dto 打卡记录参数
     * @return 打卡记录
     */
    List<AttendanceRecordRep> recordList(AttendanceRecordReq dto);

    /**
     * 计算考勤日期
     *
     * @param checkInTime    实际打卡时间，即员工实际进行打卡操作的时间点
     * @param shiftStartTime 班次开始时间，格式为 "HH:mm"，如 "21:00" 表示晚上9点
     * @param shiftEndTime   班次结束时间，格式为 "HH:mm"，如 "21:00" 表示晚上9点
     * @param checkInType    1-上班打卡，2-下班打卡
     * @return 计算出的考勤日期，表示该次打卡记录应归属的考勤周期日期
     */
    Date calculateAttendanceDate(Date checkInTime, String shiftStartTime, String shiftEndTime, String checkInType);

    /**
     * 查询可打卡类型:1=签到,2=签退
     */
    String getRecordType();

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