package jnpf.model.attendance.vo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 用户指定日期班次信息VO
 * 合并展示普班班次和请假信息，请假作为班次的补充
 *
 * @author Generated
 * @create 2026-05-06
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "用户指定日期班次信息VO")
public class UserDayShiftInfoVo {

    /**
     * 用户ID
     */
    @Schema(description = "用户ID")
    private String userId;

    /**
     * 用户姓名
     */
    @Schema(description = "用户姓名")
    private String userName;

    /**
     * 查询日期
     */
    @Schema(description = "查询日期")
    private String queryDate;

    /**
     * 考勤组ID
     */
    @Schema(description = "考勤组ID")
    private String groupId;

    /**
     * 考勤组名称
     */
    @Schema(description = "考勤组名称")
    private String groupName;

    /**
     * 时段信息列表（包含普班和请假，按时间排序）
     * - 普班未被请假覆盖：展示普班时段
     * - 普班被请假部分覆盖：展示剩余普班时段 + 请假时段
     * - 普班被请假完全覆盖：只展示请假时段
     * - 无普班只有请假：展示请假时段
     */
    @Schema(description = "时段信息列表（包含普班和请假，按时间排序）")
    private List<ShiftPeriodVo> shiftPeriods;

    /**
     * 时段信息（统一展示普班和请假）
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "时段信息")
    public static class ShiftPeriodVo {
        
        /**
         * 时段ID（班次ID或请假ID）
         */
        @Schema(description = "时段ID（班次ID或请假ID）")
        private String periodId;

        /**
         * 考勤组ID
         */
        @Schema(description = "考勤组ID")
        private String groupId;

        /**
         * 考勤组名称
         */
        @Schema(description = "考勤组名称")
        private String groupName;

        /**
         * 时段类型：1-普班，3-请假，5-假期，6-不计薪假，7-计薪假
         */
        @Schema(description = "时段类型：1-普班，3-请假，5-假期，6-不计薪假，7-计薪假")
        private Integer periodType;

        /**
         * 时段类型名称
         */
        @Schema(description = "时段类型名称（普班/请假/假期等）")
        private String periodTypeName;

        /**
         * 班次名称（仅普班时有值）
         */
        @Schema(description = "班次名称（仅普班时有值）")
        private String shiftName;

        /**
         * 请假类型名称（仅请假时有值）
         */
        @Schema(description = "请假类型名称（仅请假时有值）")
        private String leaveTypeName;

        /**
         * 开始时间
         */
        @Schema(description = "开始时间")
        private String startTime;

        /**
         * 结束时间
         */
        @Schema(description = "结束时间")
        private String endTime;

        /**
         * 迟到时间点（仅普班时有值）
         */
        @Schema(description = "迟到时间点（仅普班时有值）")
        private String latePoint;

        /**
         * 时长（分钟）
         */
        @Schema(description = "时长（分钟）")
        private Integer durationMinutes;

        /**
         * 是否跨天：0-否，1-是
         */
        @Schema(description = "是否跨天：0-否，1-是")
        private Integer isCrossDay;

        /**
         * 是否被请假覆盖：0-未覆盖，1-部分覆盖，2-完全覆盖
         */
        @Schema(description = "是否被请假覆盖：0-未覆盖，1-部分覆盖，2-完全覆盖（仅普班有效）")
        private Integer coverageStatus;

        /**
         * 关联的请假ID（普班被请假覆盖时有值）
         */
        @Schema(description = "关联的请假ID（普班被请假覆盖时有值）")
        private String relatedLeaveId;
    }
}
