package com.xvji.domain;

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.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.Map;

/**
 * 组件表实体类（对应component表）
 * 统一使用Jackson处理JSON
 */
@TableName("component")
@Data
public class Component {
    /**
     * 组件ID（自增主键）
     */
    @TableId(type = IdType.AUTO)
    private Long componentId;

    /**
     * 任务ID：关联训练任务表（t_task_id）或预测任务表（p_task_id）
     */
    private Long taskId;

    /**
     * 任务类型：0-训练任务，1-预测任务（区分组件归属）
     */
    private Integer taskType;

    /**
     * 组件类型
     */
    private String componentType;

    /**
     * 组件参数
     * @JsonIgnore：序列化时忽略该字段，避免返回字符串格式的params
     */
    @JsonIgnore
    @TableField("PARAMS") // 明确对应数据库的PARAMS字段（避免字段名映射错误）
    private String params;

    /**
     * 接口地址
     */
    private String interfaceUrl;

    /**
     * 是否启用：true启用，false禁用
     */
    @TableField("IS_ENABLE")
    private Boolean isEnable;

    /**
     * Jackson对象映射器 全局单例模式 避免重复创建实例
     */
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    /**
     * 将数据库的JSON字符串转为Map，序列化时字段名为"params"
     * @return Map<String, Object> 组件参数键值对（JSON对象格式）
     */
    @JsonProperty("params")
    public Map<String, Object> getParamsMap() {
        // 处理空值：params为null或空字符串时返回null
        if (params == null || params.trim().isEmpty()) {
            return null;
        }
        try {
            // 用Jackson解析JSON字符串为Map
            return OBJECT_MAPPER.readValue(params, new TypeReference<Map<String, Object>>() {});
        } catch (Exception e) {
            // 解析失败时打印日志
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将Map转为JSON字符串，存入数据库的PARAMS字段
     * @param paramsMap 组件参数键值对
     */
    public void setParamsMap(Map<String, Object> paramsMap) {
        // 当paramsMap为空时，数据库存储null
        if (paramsMap == null || paramsMap.isEmpty()) {
            this.params = null;
            return;
        }
        try {
            // 用Jackson将Map转为JSON字符串
            this.params = OBJECT_MAPPER.writeValueAsString(paramsMap);
        } catch (Exception e) {
            // 序列化失败时打印日志，数据库存储null
            e.printStackTrace();
            this.params = null;
        }
    }
}