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

import cn.axzo.msg.center.api.custombutton.ProposedButtons;
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler;
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.TodoType;
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 lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @author yanglin
 */
@Setter
@Getter
@TableName(value = "todo", autoResultMap = true)
public class Todo extends BaseEntityExt<Todo> {

    /**
     * 待办业务id
     */
    private Long todoBusinessId;

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

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

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

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

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

    /**
     * 消息标题
     */
    private String title;

    /**
     * 消息内容
     */
    private String content;

    /**
     * 待办类别. EXECUTABLE: 可执行的; COPIED_TO_ME: 抄送给我的
     */
    private TodoType type;

    /**
     * 待办状态
     */
    private PendingMessageStateEnum state;

    /**
     * 企业id
     */
    private Long ouId;

    /**
     * 执行者的自然人ID
     */
    private Long executorPersonId;

    /**
     * 执行者ID
     */
    private Long executorId;

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

    /**
     * 执行者姓名
     */
    private String executorName;

    /**
     * 执行者身份
     */
    private IdentityTypeEnum executorType;

    /**
     * 消息所属组织类型
     */
    private OrganizationTypeEnum orgType;

    /**
     * 业务扩展参数
     */
    @TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
    private JSONObject bizExtParam;

    /**
     * 路由参数
     */
    @TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
    private JSONObject routerParams;

    /**
     * 消息所属组织Id
     */
    private Long orgId;

    /**
     * 消息所属组织名称
     */
    private String orgName;

    /**
     * 业务描述eg:流程结点描述
     */
    private String bizDesc;

    /**
     * 在这个时间之前都不显示
     */
    private Date hideUntil;

    /**
     * ouId是否已经迁移
     */
    private YesOrNo isOuIdMigrated;

    /**
     * 是否支持批量处理
     */
    private YesOrNo supportBatchProcess;

    /**
     * 保存额外的数据信息
     */
    @TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
    private PendingRecordExt recordExt = new PendingRecordExt();

    /**
     * 自定义按钮
     */
    @TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
    private ProposedButtons proposedButtons;

    // !! helper

    /**
     * 辅助字段, 用于统计数量
     */
    @TableField(exist = false)
    private int count;

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

    /**
     * 执行待办是否已经完成(处理)
     */
    public boolean isExecCompleted() {
        return type == TodoType.EXECUTABLE && state == PendingMessageStateEnum.COMPLETED;
    }
}