package com.boco.nbd.wios.flow.process;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.boco.nbd.cams.core.util.LambdaUtils;
import com.boco.nbd.framework.workflow.entity.SubmitFlowRequest;
import com.boco.nbd.framework.workflow.entity.SubmitTypeEnum;
import com.boco.nbd.framework.workflow.entity.TaskInfoResponse;
import com.boco.nbd.framework.workflow.entity.exception.FlowException;
import com.boco.nbd.framework.workflow.flow.AbstractFlow;
import com.boco.nbd.wios.flow.entity.bo.LocalSubmitFlowBO;
import com.boco.nbd.wios.flow.entity.po.OrderPO;
import com.boco.nbd.wios.flow.enums.FlowNodeEnum;
import com.boco.nbd.wios.flow.service.IOrderService;
import com.boco.nbd.wios.flow.util.ProcessUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author:cao hai
 * @date:2022/6/30 17:04
 * @version:V1.0
 * @description:Process103
 * @modify:
 */
@Service("Process103")
public class Process103 extends AbstractFlow {

    @Autowired
    protected IOrderService orderService;

    /**
     * 预处理(业务数据调整)
     *
     * @param request
     */
    @Override
    protected void preProcess(SubmitFlowRequest request) {
        LocalSubmitFlowBO bo = (LocalSubmitFlowBO) request;
        if (SubmitTypeEnum.TaskFlow.equals(bo.getSubmitType())) {
            StringBuffer builder = new StringBuffer();
            boolean refuseFlag = ProcessUtil.compare(bo.getBusiness().getWhether(), 0);
            builder.append(refuseFlag ? "拒单:" : "接单");
            if (refuseFlag) {
                if (StrUtil.isEmpty(bo.getBusiness().getRefuseOrderReason())) {
                    throw new FlowException(LambdaUtils.getFieldApiModelProperty(OrderPO::getRefuseOrderReason) + "未填写.");
                }
                builder.append(";" + System.lineSeparator());
                builder.append(LambdaUtils.getFieldApiModelProperty(OrderPO::getRefuseOrderReason) + ":" + bo.getBusiness().getRefuseOrderReason());
                bo.setNextNodeEnum(FlowNodeEnum.NODE_102);
                //根据轨迹获取上一节点操作
                List<TaskInfoResponse> tracks = orderService.getTrackByWorkId(bo.getWorkId());
                if (CollUtil.isEmpty(tracks)) {
                    throw new FlowException(bo.getWorkId() + "根据估计获取上一节点操作信息异常.");
                }
                bo.getUserNames().add(tracks.get(0).getDealUser());
            } else {
                if (bo.getBusiness().getSurveyStaffId() == null) {
                    throw new FlowException("未选择下一节点操作用户.");
                }
                bo.getUserNames().add(bo.getBusiness().getSurveyStaffId() + "");
                bo.setNextNodeEnum(FlowNodeEnum.NODE_104);
            }
            bo.setCommentMsg(builder.toString());
        }
    }

    /**
     * 验证参数
     *
     * @param request
     */
    @Override
    protected void verifyParam(SubmitFlowRequest request) {

    }

    /**
     * 后续处理
     *
     * @param request
     */
    @Override
    protected void postProcess(SubmitFlowRequest request) {

    }
}