package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch;

import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 比大小值
 */
@Slf4j
@Service
public class MesNumberRuleMatchCompareRangeService implements IMesNumberRuleMatchDispatchService {

    @Override
    public Map<String, Object> matchNumberRule(String organizeCode, String sn, Object... params) {

        Map<String, Object> result = new HashMap<>();
        result.put(MesPcnExtConstWords.RESULT, false);

        if (!MesProductionAssemblyContext.class.isAssignableFrom(params[0].getClass())) {
            result.put(MesPcnExtConstWords.MESSAGE, "参数匹配规则信息不是装配件匹配规则!");
            return result;
        }

        MesProductionAssemblyContext context =  (MesProductionAssemblyContext) params[0];
        if (StringUtils.isEmpty(context.getMaxValue()) || StringUtils.isEmpty(context.getMinValue())) {
            result.put(MesPcnExtConstWords.MESSAGE, "请检查匹配规则信息的[最大值/最小值]是否均维护!");
            return result;
        }

        Double snValue;
        try {
            snValue = Double.parseDouble(sn);
        } catch (NumberFormatException e) {
            result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描信息[%s]不匹配规则确认方式大小校验!", sn));
            return result;
        }

        if (snValue > context.getMaxValue()) {
            result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描信息[%s]不匹配规则最大值[%s]!", sn, context.getMaxValue()));
            return result;
        }

        if (snValue < context.getMinValue()) {
            result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描信息[%s]不匹配规则最小值[%s]!", sn, context.getMinValue()));
            return result;
        }

        result.put(MesPcnExtConstWords.RESULT, true);

        return result;
    }
}
