package com.ycwl.basic.device.entity.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 设备视频连续性检查缓存实体
 * 用于存储在Redis中的检查结果
 *
 * @author Claude Code
 * @date 2025-09-01
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeviceVideoContinuityCache implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 设备ID
     */
    private Long deviceId;

    /**
     * 检查时间
     */
    private Date checkTime;

    /**
     * 检查的开始时间
     */
    private Date startTime;

    /**
     * 检查的结束时间
     */
    private Date endTime;

    /**
     * 是否支持连续性检查
     */
    private Boolean support;

    /**
     * 视频是否连续
     */
    private Boolean continuous;

    /**
     * 视频总数
     */
    private Integer totalVideos;

    /**
     * 总时长(毫秒)
     */
    private Long totalDurationMs;

    /**
     * 允许的最大间隙(毫秒)
     */
    private Long maxAllowedGapMs;

    /**
     * 间隙数量
     */
    private Integer gapCount;

    /**
     * 间隙列表(简化版,只包含关键信息)
     */
    private List<GapInfo> gaps;

    /**
     * 间隙信息简化类
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class GapInfo implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 前一个文件名
         */
        private String beforeFileName;

        /**
         * 后一个文件名
         */
        private String afterFileName;

        /**
         * 间隙时长(毫秒)
         */
        private Long gapMs;

        /**
         * 间隙开始时间
         */
        private Date gapStartTime;

        /**
         * 间隙结束时间
         */
        private Date gapEndTime;
    }

    /**
     * 从VideoContinuityResult创建缓存对象
     *
     * @param deviceId 设备ID
     * @param result 检查结果
     * @param startTime 检查开始时间
     * @param endTime 检查结束时间
     * @return 缓存对象
     */
    public static DeviceVideoContinuityCache fromResult(Long deviceId, VideoContinuityResult result,
                                                        Date startTime, Date endTime) {
        DeviceVideoContinuityCache cache = new DeviceVideoContinuityCache();
        cache.setDeviceId(deviceId);
        cache.setCheckTime(new Date());
        cache.setStartTime(startTime);
        cache.setEndTime(endTime);
        cache.setSupport(result.isSupport());
        cache.setContinuous(result.isContinuous());
        cache.setTotalVideos(result.getTotalVideos());
        cache.setTotalDurationMs(result.getTotalDurationMs());
        cache.setMaxAllowedGapMs(result.getMaxAllowedGapMs());
        cache.setGapCount(result.getGapCount());

        // 转换间隙列表
        if (result.getGaps() != null && !result.getGaps().isEmpty()) {
            List<GapInfo> gapInfos = result.getGaps().stream()
                .map(gap -> new GapInfo(
                    gap.getBeforeFile() != null ? gap.getBeforeFile().getName() : null,
                    gap.getAfterFile() != null ? gap.getAfterFile().getName() : null,
                    gap.getGapMs(),
                    gap.getGapStartTime(),
                    gap.getGapEndTime()
                ))
                .toList();
            cache.setGaps(gapInfos);
        }

        return cache;
    }
}
