package cn.axzo.workflow.common.model.request.bpmn;

import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * JSON 版本的 BPMN 协议中 UserTask 节点的属性扩展模型
 */
@ApiModel("JSON 版本的 BPMN 协议中 UserTask 节点的属性扩展模型")
@Data
public class BpmnJsonNodeProperty {

    //*************     审批方式Start      **************//
    /**
     * 审批方式: human(人工审批), autoPassed(自动通过), autoRejection(自动驳回), nobody(不审批[仅业务节点可能有该值])
     */
    @ApiModelProperty(value = "任务节点: 审批方式", notes = "human: 人工审批, autoPassed: 自动通过, autoRejection: 自动驳回, nobody: " +
            "不审批[仅业务节点可能有该值]")
    @NotBlank(message = "审批方式不能为空")
    private ApprovalMethodEnum approvalMethod;
    //*************     审批方式End      **************//


    //*************     审批人所在范围Start      **************//
    /**
     * 审批人所在范围:  entWorkspace(企业工作台), projectWorkspace(项目工作台), preTaskUser(上节点审批人所在单位)
     */
    @ApiModelProperty(value = "任务节点: 审批人所在范围", notes = "entWorkspace: 企业工作台, projectWorkspace: 项目工作台, preTaskUser:" +
            " 上节点审批人所在单位")
    private ApproverScopeEnum approverScope;
    //*************     审批人所在范围End      **************//


    //*************     审批人指定Start      **************//
    /**
     * 审批人指定: position(指定岗位), role(指定角色), identity(指定身份), initiatorLeader(发起人主管), initiatorLeaderRecursion(发起人多级主管),
     * fixedPerson(固定人员)
     */
    @ApiModelProperty(value = "任务节点: 审批人指定", notes = "position: 指定岗位, role: 指定角色, identity: 指定身份, initiatorLeader: " +
            "发起人主管, initiatorLeaderRecursion: 发起人多级主管, fixedPerson: 固定人员")
    @NotBlank(message = "审批人指定不能为空")
    private ApproverSpecifyEnum approverSpecify;

    /**
     * 具体的配置值
     * <p>
     * 如果是固定人员，那么这里是人员集合
     * [{"assignee":"111","assigneeType": "", "assignerName":"wangli", "personId": "", "tenantId":"296", "ouId":""}]
     */
    @ApiModelProperty(value = "任务节点: 审批人指定的具体值")
    private String specifyValue;
    //*************     审批人指定End      **************//


    //*************     多人审批时审批方式Start      **************//
    /**
     * 是否是多实例Task节点, 在安心筑业务中, 所有节点应该都是多实例节点
     */
    @ApiModelProperty(value = "任务节点: 是否是多实例Task节点", notes = "在安心筑业务中, 所有节点应该都是多实例节点")
    private Boolean isMultiTask = true;

    @ApiModelProperty(value = "任务节点: 多实例Task节点下多人时,是并行还是串行", notes = "目前前端还不支持该配置", hidden = true)
    private Boolean isSequential = false;

    /**
     * Task 多实例模式；OR："或签"，AND："会签"
     */
    @ApiModelProperty(value = "任务节点: 多实例模式；OR：或签，AND：会签")
    @NotNull(message = "多实例模式不能为空")
    private BpmnFlowNodeMode multiMode;
    //*************     多人审批时审批方式End      **************//


    //*************     审批人为空时Start      **************//
    /**
     * 审批人为空处理方式 autoPassed: 自动通过, autoRejection: 自动驳回, transferToAdmin: 转交给管理员
     */
    @ApiModelProperty(value = "任务节点: 审批人为空处理方式", notes = "autoPassed: 自动通过, autoRejection: 自动驳回, transferToAdmin: 转交给管理员")
    @NotBlank(message = "审批人为空处理方式不能为空")
    private ApproverEmptyHandleTypeEnum approverEmptyHandleType;

    @ApiModelProperty(value = "审批人为空时,指定的人", notes = "list 的 String 格式, String 是 BpmnTaskDelegateAssigner 对象")
    private String emptyApproverSpecify;
    //*************     审批人为空时的策略End      **************//


    /**
     * 表单字段权限, JSON 格式,按照 UI 进行自定义组装, 引擎不做任何解析, 之后的需求会让业务方前端开发来消费这里的配置
     */
    @ApiModelProperty(value = "发起人节点/任务节点: 字段权限集合", notes = "后端不做任何解析, 前端给什么样,就返什么样")
    private String fieldPermission;

    /**
     * 按钮权限
     */
    @ApiModelProperty(value = "发起人节点/任务节点: 按钮权限集合")
    private BpmnButtonConf buttonPermission;

    /**
     * 节点的待办消息模板配置
     */
    private BpmnPendingProperty pending;


    //*************     条件节点Start      **************//
    /**
     * 条件节点专属属性: 是否是默认分支;
     */
    @ApiModelProperty(value = "条件节点: 是否是默认条件分支")
    @NotNull(message = "是否是默认条件分支不能为空")
    private Boolean defaultBranch;

    /**
     * 条件节点专属属性: 条件分组集合
     */
    @ApiModelProperty(value = "条件节点: 条件分组集合")
    private List<BpmnConditionGroup> groups;

    /**
     * 条件节点专属属性: 条件组之间的计算模型,目前仅支持 or
     */
    @ApiModelProperty(value = "条件组之间的计算模型,目前仅支持 or")
    private String groupsType = "or";
    //*************     条件节点End      **************//

    //*************     抄送节点Start      **************//
    /**
     * 抄送节点配置
     */
    @ApiModelProperty(value = "抄送节点: 多组配置,最多五组")
    private List<BpmnCarbonCopyConf> carbonCopyConf;
    //*************     抄送节点Start      **************//

    /**
     * 发起时使用的表单 key
     */
    @ApiModelProperty(value = "发起时使用的表单 key")
    private String formKey;
}
