package org.dromara.rfid.domain.vo;

import lombok.Data;

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

/**
 * 看板数据 VO
 *
 * @author zch
 * @date 2025-11-26
 */
@Data
public class DashboardVO implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    // ==================== 顶层属性（用于 getDashboardData 返回） ====================

    /**
     * 统计概览
     */
    private StatisticsOverview overview;

    /**
     * 位置树（含设备信息）
     */
    private List<LocationTreeNode> locationTree;

    /**
     * 成功率趋势数据
     */
    private List<SuccessRateTrend> successRateTrends;

    /**
     * 告警统计列表
     */
    private List<AlarmStatVO> alarmStats;

    // ==================== 内部类定义 ====================

    /**
     * 实时统计数据（按秒刷新）
     * <p>
     * 包含：顶部统计 + 告警统计列表
     * </p>
     */
    @Data
    public static class RealtimeStats implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 统计概览
         */
        private StatisticsOverview overview;

        /**
         * 告警统计列表
         */
        private List<AlarmStatVO> alarmStats;
    }

    /**
     * 统计概览
     */
    @Data
    public static class StatisticsOverview implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 设备总数
         */
        private Long deviceTotal;

        /**
         * 在线数量
         */
        private Long onlineCount;

        /**
         * 离线数量
         */
        private Long offlineCount;

        /**
         * 告警数量
         */
        private Long alarmCount;
    }

    /**
     * 位置树节点
     * <p>
     * 用于构建位置树，当 locationType = 3 时表示设备节点，包含设备信息。
     * 前端通过 deviceId 匹配 WebSocket 实时数据。
     * </p>
     */
    @Data
    public static class LocationTreeNode implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        // ==================== 位置信息 ====================

        /**
         * 位置ID
         */
        private Long id;

        /**
         * 位置编号
         */
        private String locationCode;

        /**
         * 位置别名
         */
        private String locationAlias;

        /**
         * 位置类型 (1-车间; 2-工序; 3-工位/设备)
         */
        private String locationType;

        /**
         * 父级位置ID
         */
        private Long parentId;

        // ==================== 设备信息（仅当 locationType=3 时有值） ====================

        /**
         * 设备ID（前端用于匹配 WebSocket 数据）
         */
        private Long deviceId;

        /**
         * 设备编号
         */
        private String deviceCode;

        /**
         * 设备名称
         */
        private String deviceName;

        /**
         * 在线状态 (1-在线; 0-离线)
         */
        private String onlineStatus;

        /**
         * 告警状态 (0-正常; 1-告警)
         */
        private String alarmStatus;

        // ==================== 子节点 ====================

        /**
         * 子节点列表
         */
        private List<LocationTreeNode> children;
    }

    // ==================== 以下为已废弃的实体类，保留以备参考 ====================

    /*
     * 设备状态 VO（已废弃，改用 LocationTreeNode）
     *
    @Data
    public static class DeviceStatusVO implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;
        private Long deviceId;
        private String deviceCode;
        private String deviceName;
        private Long locationId;
        private String locationAlias;
        private String onlineStatus;
        private String alarmStatus;
        private LatestReadRecord latestRecord;
    }
    */

    /*
     * 最新读取记录（已废弃，读取记录改由 WebSocket 实时推送）
     *
    @Data
    public static class LatestReadRecord implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;
        private String stationName;
        private String barcode;
        private String recordTime;
        private String readStatus;
    }
    */

    /**
     * 成功率趋势
     */
    @Data
    public static class SuccessRateTrend implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 时间点（小时，如 "09:00"）
         */
        private String timePoint;

        /**
         * 成功率（百分比，如 98.5）
         */
        private Double successRate;

        private Double yesterdaySuccessRate;
    }

    /**
     * 告警统计
     */
    @Data
    public static class AlarmStatVO implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 告警时间
         */
        private String alarmTime;

        /**
         * 设备名称
         */
        private String deviceName;

        /**
         * 位置
         */
        private String location;

        /**
         * 告警级别
         */
        private String alarmLevel;

        /**
         * 告警行为
         */
        private String alarmAction;
    }
}
