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

import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import cn.axzo.msg.center.service.enums.YesOrNo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;
import java.util.Date;
import java.util.Optional;

/**
 * @description
 *   待办消息记录表数据模型
 * @author cold_blade
 * @date 2023/9/20
 * @version 1.0
 */
@Setter
@Getter
@TableName("pending_message_record")
public class PendingMessageRecord extends BaseEntityExt<PendingMessageRecord>
        implements Serializable , PendingRecordAdapter {

    private static final long serialVersionUID = 2184329278851311992L;

    /**
     * 消息的唯一标识
     */
    private String identityCode;
    /**
     * 请求批次号
     */
    private String requestNo;
    /**
     * 发起者ID
     */
    private Long promoterId;
    /**
     * 发起者的自然人ID
     */
    private Long promoterPersonId;
    /**
     * 发起者姓名
     */
    private String promoterName;
    /**
     * 发起者身份
     */
    private IdentityTypeEnum promoterType;
    /**
     * 执行者ID
     */
    private Long executorId;
    /**
     * 执行者的自然人ID
     */
    private Long executorPersonId;
    /**
     * 执行者姓名
     */
    private String executorName;
    /**
     * 执行者身份
     */
    private IdentityTypeEnum executorType;
    /**
     * 模板编码
     */
    private String templateCode;
    /**
     * 消息标题
     */
    private String title;
    /**
     * 消息内容
     */
    private String content;
    /**
     * 消息所属组织类型
     */
    private OrganizationTypeEnum orgType;
    /**
     * 消息所属组织Id
     */
    private Long orgId;
    /**
     * 消息所属组织名称
     */
    private String orgName;
    /**
     * 消息所属企业ID
     */
    private Long ouId;
    /**
     * 待办状态
     */
    private PendingMessageStateEnum state;
    /**
     * 业务类型
     */
    private BizCategoryEnum bizCategory;
    /**
     * 关联业务主键
     */
    private String bizCode;
    /**
     * 流程类代办的流程结点编码
     */
    private String subBizCode;
    /**
     * 业务描述eg:流程结点描述
     */
    private String bizDesc;
    /**
     * 业务标签
     */
    private String bizFlag;
    /**
     * 业务扩展参数
     */
    private String bizExtParam;
    /**
     * 路由参数（留存）
     */
    private String routerParams;
    /**
     * 业务终态，可为空
     */
    private BizFinalStateEnum bizFinalState;
    /**
     * 待办的截止时间
     */
    private Date deadline;
    /**
     * 重试次数
     */
    private Integer retryCount;
    /**
     * 最终失败原因
     */
    private String failCause;
    /**
     * 在这个时间之前不显示
     */
    private Date hideUntil;
    /**
     * 保存额外的数据信息
     */
    @TableField(value = "record_ext", typeHandler = FastjsonTypeHandler.class)
    private PendingRecordExt recordExt;
    /**
     * ouId是否已经迁移 (解决ouId不准的问题)
     */
    private YesOrNo isOuIdMigrated;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }

    public String mergeRouterParams(RouterParams routerParams) {

        JSONObject jsonObject = Optional.ofNullable(this.getRouterParams())
                .map(JSON::parseObject)
                .orElseGet(JSONObject::new);
        jsonObject.fluentPutAll(JSONObject.parseObject(JSONObject.toJSONString(routerParams)));
        return jsonObject.toJSONString();
    }

    public RouterParams resolveRouterParams() {
        JSONObject jsonObject = Optional.ofNullable(this.getRouterParams())
                .map(JSON::parseObject)
                .orElseGet(JSONObject::new);
        return JSONObject.toJavaObject(jsonObject, RouterParams.class);
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class RouterParams {
        private String workspaceId;

        private String ouId;

        private String taskId;

        private String taskNo;
    }
}
