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

import java.util.Map;

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.PmContMscTech;
import com.xisc.pm.infra.constant.RuleSetConstants;
import com.xisc.pm.infra.enums.PdRuleItemType;

import io.choerodon.core.exception.CommonException;

/**
 * 切断方式匹配 （C03）
 * 
 * @author jun.zeng
 * 
 *         14) 当规则号RULE_NO为26，进行轴合同与非轴合同切断方式相等匹配校验：
 *         对传入的轴合同和非轴合同，根据合同号order_no、去向产线号msc_line_no
 *         获取轴合同、非轴合同来自合同产线工艺参数表PM_CONT_MSC_TECH的切断方式代码CUT_MODE_CODE。
 *         若没有查到相关信息，返回错误：读生产合同池没有找到记录，合同号【order_no】，产线号【msc_line_no】。
 *         若其他合同切断方式代码与轴合同不相等，且该合同的检查标记check_flag为1，置其为0，
 *         并在check_msg记录信息：切断方式代码与轴合同不一致；
 *
 * 
 */
@Component
public class CutModeRuleExecStrategy implements RuleExecStrategy {

    @Override
    public void afterPropertiesSet() throws Exception {
        RuleExecStrategyFactory.register(PdRuleItemType.CUT_MODE_THE_SAME, 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);

        PmContMscTech axisPmContMscTech = (PmContMscTech) bizData.get(RuleSetConstants.AXIS_PM_CONT_MSC_TECH);
        PmContMscTech pmContMscTech = (PmContMscTech) bizData.get(RuleSetConstants.PM_CONT_MSC_TECH);

        if (axisPmContMscTech == null || pmContMscTech == null) {
            // 读生产合同池没有找到记录，合同号【order_no】，产线号【msc_line_no】
            throw new CommonException("pm.pm_pd_rule_set_001", orderNo, mscLineNo);
        }
        if(axisPmContMscTech.getCutModeCode() ==  null && pmContMscTech.getCutModeCode() == null) {
            return true ;
        }
        if(axisPmContMscTech.getCutModeCode() != null && axisPmContMscTech.getCutModeCode().equals(pmContMscTech.getCutModeCode())) {
            return true ;
        }
        throw new CommonException("pm.pm_pd_rule_set_006",axisPmContMscTech.getCutModeCode() ,pmContMscTech.getCutModeCode()) ;
    }

}
