package com.xisc.pm.app.service.strategy.pdrule;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import com.xisc.pm.api.dto.RuleParamDTO;
import com.xisc.pm.app.service.strategy.RuleExecStrategyFactory;
import com.xisc.pm.domain.entity.PmProContProdTtr;
import com.xisc.pm.infra.constant.RuleSetConstants;
import com.xisc.pm.infra.enums.PdRuleItemType;

import io.choerodon.core.exception.CommonException;

/**
 * 会检材合同单独组板 （S02）
 * 
 * @author jun.zeng
 * 
 *         若传入合同数少于2个，校验通过。
 *         对传入的轴合同和非轴合同，根据合同号order_no获取轴合同、非轴合同来自生产合同产品属性表PM_PRO_CONT_PROD_ATTR的厚板会检方式代码CHECK_METHOD_CODE。
 *         若没有查到相关信息，返回错误：读生产合同池没有找到记录，合同号【order_no】。
 *         若轴合同厚板会检方式代码首位为‘B’或‘C’或‘D’，其是会检材，其他合同检查标记check_flag为1的合同，置其检查标记为0，并在check_msg记录信息：轴合同为会检材，单独组板！
 *         否则，对传入的其他合同，若其厚板会检方式代码首位为‘B’或‘C’或‘D’且check_flag为1，置check_flag为0，check_msg记录：会检材合同单独组板！
 * 
 * 
 */
@Component
public class CheckMethodSingleMatchRuleExecStrategy implements RuleExecStrategy {

    @Override
    public void afterPropertiesSet() throws Exception {
        RuleExecStrategyFactory.register(PdRuleItemType.CHECK_METHOD_SINGLE_MATCH, this);
    }

    @Override
    public boolean execRule(RuleParamDTO ruleParam) {
        Map<String, Object> bizData = ruleParam.getBizData();
        String orderNo = (String) bizData.get(RuleSetConstants.ORDER_NO);
        String mscLineNo = (String) bizData.get(RuleSetConstants.MSC_LINE_NO);

        PmProContProdTtr axisPmProContProdTtr = (PmProContProdTtr) bizData.get(RuleSetConstants.AXIS_PM_PRO_CONT_PROD_ATTR);
        PmProContProdTtr pmProContProdTtr = (PmProContProdTtr) bizData.get(RuleSetConstants.PM_PRO_CONT_PROD_ATTR);

        if (axisPmProContProdTtr == null || pmProContProdTtr == null) {
            // 读生产合同池没有找到记录，合同号【order_no】，产线号【msc_line_no】
            throw new CommonException("pm.pm_pd_rule_set_001", orderNo, mscLineNo);
        }
        if(pmProContProdTtr.getOrderNo().equals(axisPmProContProdTtr.getOrderNo())) {
            return true ;
        }
        if(isCheckMethodFlag(axisPmProContProdTtr.getCheckMethodCode())) {
            throw new CommonException("pm.pm_pd_rule_set_022");
        }
        if(isCheckMethodFlag(pmProContProdTtr.getCheckMethodCode())) {
            throw new CommonException("pm.pm_pd_rule_set_023");
        }
        return true;
    }
    
    private boolean isCheckMethodFlag(String checkMethodCode) {
        if(StringUtils.isNotBlank(checkMethodCode)) {
            char value = checkMethodCode.charAt(0);
            if(value == 'B' || value == 'C' || value == 'D') {
                return true ;
            }
        }
        return false;
    }

}
