package com.sd.business.flow;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.fjhx.flow.core.FlowDelegate;
import com.fjhx.flow.core.FlowThreadLocalUtil;
import com.fjhx.flow.enums.FlowStatusEnum;
import com.fjhx.flow.enums.HandleTypeEnum;
import com.ruoyi.common.core.domain.BaseIdPo;
import com.ruoyi.common.core.domain.BasePo;
import com.ruoyi.common.utils.SecurityUtils;
import com.sd.business.entity.apply.dto.ApplyBuyDto;
import com.sd.business.entity.apply.po.ApplyBuy;
import com.sd.business.entity.apply.po.ApplyBuyBom;
import com.sd.business.service.apply.ApplyBuyBomService;
import com.sd.business.service.apply.ApplyBuyService;
import com.sd.business.util.CodeEnum;
import com.sd.framework.util.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 发起申购流程
 */
@Service
public class ApplyFlow extends FlowDelegate {

    @Autowired
    private ApplyBuyService applyBuyService;

    @Autowired
    private ApplyBuyBomService applyBuyBomService;

    @Override
    public String getFlowKey() {
        return "apply_buy";
    }

    @Override
    public Long start(Long flowId, JSONObject submitData) {
        ApplyBuyDto applyBuyDto = submitData.toJavaObject(ApplyBuyDto.class);
        validated(applyBuyDto);

        Long applyBuyId = IdWorker.getId();

        applyBuyDto.setId(applyBuyId);
        applyBuyDto.setCode(CodeEnum.APPLY_BUY_CODE.getCode());
        applyBuyDto.setFlowId(flowId);
        applyBuyDto.setFlowStatus(FlowStatusEnum.IN_PROGRESS.getKey());

        List<ApplyBuyBom> applyBuyBomList = applyBuyDto.getApplyBuyBomList();
        for (ApplyBuyBom applyBuyBom : applyBuyBomList) {
            applyBuyBom.setApplyBuyId(applyBuyId);
            applyBuyBom.setPurchaseQuantity(BigDecimal.ZERO);
        }

        applyBuyService.save(applyBuyDto);
        applyBuyBomService.saveBatch(applyBuyBomList);

        return applyBuyId;
    }

    @Override
    public void end(Long flowId, Long businessId, JSONObject submitData) {

        applyBuyService.update(q -> q
                .eq(BaseIdPo::getId, businessId)
                .set(ApplyBuy::getFlowStatus, FlowStatusEnum.PASS.getKey())
                .set(BasePo::getUpdateTime, new Date())
                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
        );

    }

    public void jump() {

        // 如果是驳回,修改状态为驳回
        if (HandleTypeEnum.REJECT.equals(FlowThreadLocalUtil.getHandleTypeEnum())) {
            applyBuyService.update(q -> q
                    .eq(BaseIdPo::getId, FlowThreadLocalUtil.getBusinessId())
                    .set(ApplyBuy::getFlowStatus, FlowStatusEnum.REJECT.getKey())
                    .set(BasePo::getUpdateTime, new Date())
                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
            );
        }

    }

    /**
     * 验证数据
     */
    private void validated(ApplyBuyDto applyBuyDto) {

        Assert.notBlank(applyBuyDto.getApplyName(), "申购人不能为空");
        Assert.notEmpty(applyBuyDto.getApplyTime(), "申购时间不能为空");

        List<ApplyBuyBom> applyBuyBomList = applyBuyDto.getApplyBuyBomList();
        Assert.notEmpty(applyBuyBomList, "申购清单不能为空");

        for (ApplyBuyBom applyBuyBom : applyBuyBomList) {
            Assert.notNull(applyBuyBom.getBomSpecId(), "bomId不能为空");
            Assert.notNull(applyBuyBom.getQuantity(), "申购数量不能为空");
            Assert.gtZero(applyBuyBom.getQuantity(), "申购数量必须大于0");
        }

    }

}