package cn.axzo.msg.center.domain.entity;

import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler;
import cn.axzo.msg.center.service.enums.TodoLogType;
import com.alibaba.fastjson.JSONObject;
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 lombok.Getter;
import lombok.Setter;

import java.util.Date;
import java.util.Map;

/**
 * @author yanglin
 */
@Setter
@Getter
@TableName(value = "todo_log", autoResultMap = true)
public class TodoLog {

    /**
     * 源模板编码. 比如抄送, 保存审批流的待办模版code
     */
    private String srcTemplateCode;

    /**
     * 待办内容模板编码. 比如抄送, 保存审批流的待办模版code或抄送的待办模版code
     */
    private String templateCode;

    /**
     * 日志类型
     */
    private TodoLogType logType;

    /**
     * 上下文
     */
    private String context;

    /**
     * 消息的唯一标识
     */
    private String identityCode;

    /**
     * 关联业务编码
     */
    private String bizCode;

    /**
     * 流程类待办的流程结点编码
     */
    private String subBizCode;

    /**
     * 关键变化
     */
    @TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
    private JSONObject logContent;

    /**
     * 额外信息
     */
    @TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
    private JSONObject recordExt;

    /**
     * 请求批次号
     */
    private String requestNo;

    /**
     * 业务类型 FLOW:流程,OTHER:其它
     * <p>不和枚举强绑定
     */
    private String category;

    /**
     * id
     */
    @TableId(type = IdType.AUTO)
    protected Long id;

    /**
     * 创建时间
     */
    private Date createAt;

    /**
     * 修改时间
     */
    private Date updateAt;

    /**
     * 是否删除 0正常，1删除
     * <p>不做逻辑删除, 清理日志做物理删除
     */
    private Long isDelete = 0L;

    // !! helper

    public TodoLog addLogContents(Map<String, Object> contents) {
        if (contents == null)
            return this;
        maybeCreateLogContent();
        logContent.putAll(contents);
        return this;
    }

    public TodoLog addLogContent(String name, Object value) {
        maybeCreateLogContent();
        logContent.put(name, value);
        return this;
    }

    private void maybeCreateLogContent() {
        if (logContent == null)
            logContent = new JSONObject();
    }

}