package com.aegis.emergency.report.domain;

import com.aegis.common.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.List;

/**
 * 上报模板实体类 report_template
 * 
 * @author aegis
 */
@Getter
@Setter
@ToString(callSuper = true)
@TableName(value = "report_template", autoResultMap = true)
public class ReportTemplate extends BaseEntity {

    private static final long serialVersionUID = 1L;

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

    /** 模板名称 */
    private String name;

    /** 模板描述 */
    private String description;

    /**
     * 字段配置（JSON）。库中可能为根数组、或带 groups/rows 等键的对象，与单一 List 强类型不兼容，故用 Object 反序列化。
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Object fields;

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

    // ========== 查询条件字段（非数据库字段） ==========
    
    /** 关键字搜索（非数据库字段） */
    @TableField(exist = false)
    private String keyword;

    /**
     * 模板字段配置（支持嵌套）
     * 结构与前端完全匹配
     */
    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class TemplateField {
        
        /** 字段ID */
        private Long id;
        
        /** 字段标签（显示名称） */
        private String label;
        
        /** 字段编码（用于数据映射） */
        private String code;
        
        /** 字段类型：text, textarea, number, date, select, group, list */
        private String type;
        
        /** 是否必填 */
        private Boolean required;
        
        /** 占位提示 */
        private String placeholder;
        
        /** 选项配置（select类型使用） */
        private List<FieldOption> options;
        
        /** 数据来源配置 */
        private FieldSource source;
        
        /** 列表配置（list类型使用） */
        private ListConfig listConfig;
        
        /** 子字段（group和list类型使用，递归结构） */
        private List<TemplateField> children;
        
        /**
         * 字段选项
         */
        @Data
        public static class FieldOption {
            private String label;
            private String value;
        }
        
        /**
         * 数据来源配置
         */
        @Data
        public static class FieldSource {
            /** 来源类型：manual-人工填写, path-事件字段, expression-计算字段 */
            private String type;
            /** 数据路径（如：dispatchTask.incident.summary） */
            private String path;
        }
        
        /**
         * 列表配置
         */
        @Data
        public static class ListConfig {
            /** 列表数据源路径（如：incident.casualties） */
            private String sourcePath;
        }
    }
}