package cn.iocoder.yudao.module.bpm.service.oa;

import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.contract.BpmOAContractCreateReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.upload.UploadUserFile;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAContractConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAContractDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAContractMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_CONTRACT_NOT_EXISTS;

/**
 * OA 合同审批 Service 实现类
 *
 * @author 符溶馨

 */
@Service
@Validated
public class BpmOAContractServiceImpl extends BpmOABaseService implements BpmOAContractService{

    /**
     * OA 合同审批对应的流程定义 KEY
     */
    public static final String PROCESS_KEY = "oa_contract";

    @Resource
    private BpmOAContractMapper contractMapper;

    @Resource
    private BpmProcessInstanceApi processInstanceApi;

    @Override
    public Long createContract(Long userId, BpmOAContractCreateReqVO createReqVO) {

        //插入OA 出差申请
        BpmOAContractDO contract = BpmOAContractConvert.INSTANCE.convert(createReqVO).setUserId(userId)
                .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
        contract.setMCompanyName(createReqVO.getmCompanyName());
        contract.setMHeadName(createReqVO.getmHeadName());
        contract.setOCompanyName(createReqVO.getoCompanyName());
        contract.setOHeadName(createReqVO.getoHeadName());
        contractMapper.insert(contract) ;

        // 发起 BPM 流程
        Map<String, Object> processInstanceVariables = new HashMap<>();
        String processInstanceId = processInstanceApi.createProcessInstance(userId,
                new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
                        .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(contract.getId()))).getCheckedData();

        // 将工作流的编号，更新到 OA 请假单中
        contractMapper.updateById(new BpmOAContractDO().setId(contract.getId()).setProcessInstanceId(processInstanceId));

        List<UploadUserFile> fileItems = createReqVO.getFileItems() ;
        //这里的逻辑，如果fileItems不为空，且有数据，那么说明是上传了附件的，则需要更工作流文件表对应的实例Id
        if (fileItems != null && !fileItems.isEmpty()) {
            uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ;
        }
        return contract.getId();
    }

    @Override
    public void updateContractResult(Long id, Integer result) {

        validateLeaveExists(id);
        contractMapper.updateById(new BpmOAContractDO().setId(id).setResult(result));
    }

    private void validateLeaveExists(Long id) {
        if (contractMapper.selectById(id) == null) {
            throw exception(OA_CONTRACT_NOT_EXISTS);
        }
    }

    @Override
    public BpmOAContractDO getContract(Long id) {

        return contractMapper.selectById(id);
    }
}
