package vip.xiaonuo.coldchain.core.alarm.bean;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.collect.Lists;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import vip.xiaonuo.coldchain.core.handler.NotificationChannelListTypeHandler;
import vip.xiaonuo.coldchain.core.handler.SensorAlarmUserTypeHandler;
import vip.xiaonuo.common.pojo.OrgEntity;

import java.util.List;

/**
 * @author jackzhou
 * @version 1.0
 * @project jfcloud-coldchain
 * @description 告警信息类，包含告警内容、告警值、告警接收人等信息。
 * @date 2024/11/26
 */
@EqualsAndHashCode(callSuper = true)
@Data
@TableName(value = "sensor_alarm", autoResultMap = true)
public class SensorAlarm extends OrgEntity {
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;
    /**
     * 告警内容，通常为告警的详细描述，例如温度、湿度等超标的具体信息
     */
    @Schema(description = "告警内容，通常为告警的详细描述，例如温度、湿度等超标的具体信息")
    private String message;

    /**
     * 告警值，表示触发告警的实际数值，例如超标的温度值
     */
    @Schema(description = "告警值，表示触发告警的实际数值，例如超标的温度值")
    private float value;

    /**
     * 告警接收人，存储告警通知的接收用户信息
     */
    @TableField(value = "alarm_users", typeHandler = SensorAlarmUserTypeHandler.class)
    @Schema(description = "告警接收人，存储告警通知的接收用户信息")
    private List<SensorAlarmUser> alarmUsers = Lists.newArrayList();

    /**
     * 预警类型(0:数据异常 1:设备离线)
     */
    @Schema(description = "类型")
    private String type;

    /**
     * 告警类型，例如温度过高、湿度过低等
     */
    @Schema(description = "告警类型，例如温度过高、湿度过低等")
    private String alarmType;

    /**
     * 告警时间，记录触发告警的时间
     */
    @Schema(description = "告警时间，记录触发告警的时间")
    private String alarmTime;

    /**
     * 告警优先级，用于区分告警的紧急程度，例如高、低、紧急等
     */
    @Schema(description = "告警优先级，用于区分告警的紧急程度，例如高、低、紧急等")
    private String priority;

    /**
     * 告警来源，记录告警是来自于哪个设备、传感器或系统
     */
    @Schema(description = "告警来源，记录告警是来自于哪个设备、传感器或系统")
    private String source;

    /**
     * 设备ID，指示告警是由哪个设备触发的
     */
    @Schema(description = "设备ID，指示告警是由哪个设备触发的")
    private String deviceId;

    /**
     * 房间名称（可选）
     */
    @Schema(description = "房间名称")
    private String roomName;

    /**
     * 设备名称，给出触发告警的设备的名称（可选）
     */
    @Schema(description = "设备名称，给出触发告警的设备的名称（可选）")
    private String deviceName;

    /**
     * 告警处理状态，用于表示告警是否已经被处理，未处理、处理中、已处理等
     */
    @Schema(description = "告警处理状态，用于表示告警是否已经被处理，未处理、处理中、已处理等")
    private String status;

    /**
     * 设备所在位置，指明告警设备的物理位置，便于定位
     */
    @Schema(description = "设备所在位置，指明告警设备的物理位置，便于定位")
    private String location;

    /**
     * 是否已通知告警接收人，标识告警是否已成功发送通知
     */
    @Schema(description = "是否已通知告警接收人，标识告警是否已成功发送通知")
    @TableField("is_notified")
    private boolean isNotified;

    /**
     * 用户的通知渠道设置，支持选择接收告警的多个渠道，如短信、邮件、APP通知等
     */
    @Schema(description = "用户的通知渠道设置，支持选择接收告警的多个渠道，如短信、邮件、APP通知等")
    @TableField(value = "notification_channel", typeHandler = NotificationChannelListTypeHandler.class)
    private List<NotificationChannel> notificationChannel = List.of(NotificationChannel.WECHAT);

    /**
     * 用户的通知时间段，限制用户接收告警的时间范围（如仅在工作时间接收告警）
     */
    @Schema(description = "用户的通知时间段，限制用户接收告警的时间范围（如仅在工作时间接收告警）")
    private String notificationTimeFrame;
    /**
     * 其他附加信息，例如报警的原因、建议措施等
     */
    @Schema(description = "其他附加信息，例如报警的原因、建议措施等")
    private String additionalInfo;

    /**
     * 告警触发阈值，记录触发告警的具体阈值
     */
    @Schema(description = "告警触发阈值，记录触发告警的具体阈值")
    private Float threshold;


    @Schema(description = "微信请求状态码")
    private String weixinRequestCode;

    @Schema(description = "设备序列号")
    private String sensorCode;

    /**
     * 传感器路数
     */
    @Schema(description = "传感器路数")
    private Integer sensorRoute;

    /**
     * 监控监控对象
     */
    @Schema(description = "监控监控对象")
    private String monitorTargetId;


    public SensorAlarm() {
    }
}
