package com.aegis.emergency.event.domain;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.aegis.common.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * 事件主表实体类 event
 * 
 * @author aegis
 */
@Getter
@Setter
@ToString(callSuper = true)
@TableName("event")
public class Event extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /** 事件ID */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    /** 事件编号（唯一） */
    private String eventNo;

    /** 事件标题 */
    private String title;

    /** 事件类型（字典值） */
    private String type;

    /** 事件级别：I/II/III/IV */
    private String level;

    /** 事件状态（枚举：{@link com.aegis.emergency.event.constant.EventStatus}）：draft-草稿，pending-待处理，processing-处理中，completed-已完成，archived-归档 */
    private String status;

    /** 是否重点事件：0-否，1-是 */
    private Integer importantFlag;

    /** 标记人为重点的操作人 */
    private String importantBy;

    /** 标记为重点的时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date importantTime;

    /** 事件发生时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date occurredAt;

    /** 地点描述 */
    private String location;

    /** 经度 */
    private BigDecimal longitude;

    /** 纬度 */
    private BigDecimal latitude;

    /** 来源渠道（枚举：{@link com.aegis.emergency.event.constant.EventSource}）：manual-人工录入，alert-接警转入，other-预留 */
    private String source;

    /** 接警记录ID（若来自接警转换，外键关联 duty_alert.id） */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long alertId;

    /** 事件摘要 */
    private String summary;

    /** 删除标志（0代表存在 2代表删除） */
    private String delFlag;

    // ========== 查询条件字段（非数据库字段） ==========
    
    /** 发生时间范围查询-开始时间（非数据库字段） */
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date beginOccurredAt;

    /** 发生时间范围查询-结束时间（非数据库字段） */
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endOccurredAt;

    /** 排除的状态列表（非数据库字段，用于查询时排除指定状态） */
    @TableField(exist = false)
    private List<String> excludeStatuses;

    /** 事件ID列表（非数据库字段，用于批量查询） */
    @TableField(exist = false)
    private List<Long> ids;

    // ========== 上报状态字段（非数据库字段，关联查询填充） ==========
    
    /** 省厅上报状态（latest report status）：pending-待上报，submitting-上报中，success-成功，failed-失败，null-未上报 */
    @TableField(exist = false)
    private String provinceReportStatus;
    
    /** 最新上报时间 */
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date provinceReportTime;
    
    /** 上报次数 */
    @TableField(exist = false)
    private Integer provinceReportCount;
    
    /** 是否有上报记录 */
    @TableField(exist = false)
    private Boolean hasProvinceReports;
    
    /** 最新上报操作人 */
    @TableField(exist = false)
    private String provinceReportOperator;
    
    // ========== 上报状态查询条件（非数据库字段） ==========
    
    /** 上报状态查询条件 */
    @TableField(exist = false)
    private String provinceReportStatusFilter;
    
    /** 上报时间范围查询-开始时间 */
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date beginProvinceReportTime;
    
    /** 上报时间范围查询-结束时间 */
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endProvinceReportTime;
}