package com.cf.imes.module.plan.service.customplatenorule;

import com.cf.imes.module.executor.api.customplateno.dto.CustomPlateNoRuleDTO;
import com.cf.imes.module.plan.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoGenerateConfigVO;
import com.cf.imes.module.plan.service.customplateno.vo.CustomPlateNoRuleVO;

/**
 * 自定义板编号生成规则服务
 *
 * @author Gqr
 * @since 2024/11/18 16:30
 */
public interface CustomPlateNoGenerateRuleService {
    /**
     * 是否匹配的规则编码
     *
     * @param ruleCode
     * @return
     */
    boolean match(String ruleCode);

    /**
     * 生成编号
     *
     * @param orderId        生产单号
     * @param plateNoRule    生成规则
     * @param generateConfig 生成所需要的配置
     * @param plateDO        板材列表
     * @param firstPlate     是否循环的第一块板，只有第一块板需要做是否跨单判断，后续都是一个单内
     * @return 生成后改变的配置
     */
    CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO, boolean firstPlate);

    /**
     * 左补零
     *
     * @param curr        当前值
     * @param plateNoRule 生成规则
     * @return
     */
    default String fillZero(int curr, CustomPlateNoRuleVO plateNoRule) {
        boolean leftFillZero = plateNoRule.isLeftFillZero();
        Integer length = plateNoRule.getLength();
        if (leftFillZero) {
            return String.format("%0" + length + "d", curr);
        }
        return String.valueOf(curr);
    }

    /**
     * 复位
     *
     * @param ruleDTO
     */
    void reset(CustomPlateNoRuleDTO ruleDTO);
}
