package com.xisc.pm.infra.util;

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

import org.apache.commons.lang3.StringUtils;

import com.xisc.pm.infra.enums.LineNoEnums;
import com.xisc.pm.infra.enums.PdMatType;

/**
 * 板坯预定工序生成
 * 
 * @author jun.zeng
 *
 */
public class PlatePreProcUtils {

    // 炼钢设计产线
    public static final String STEEL_PL_00 = "00";
    public static final String STEEL_PL_10 = "10";

    // 轧制产线
    public static final String ROLL_LINE_NO_10 = "10";
    public static final String ROLL_LINE_NO_20 = "20";
    public static final String ROLL_LINE_NO_30 = "30";
    
    
    
    /**
     * 第一道轧制工序(若whole_backlog_code取值为P1)
     * @return
     */
    public static List<String> firstRollProc(String matDesignKind , String rollLineNo , String slabNo) {
        List<String> procList = new ArrayList<String>(2);
        if(PdMatType.S.getCode().equals(matDesignKind) || PdMatType.C.getCode().equals(matDesignKind)) {
            // 余材板坯组板、出钢材组板（MAT_DESIGN_KIND为S或C时）需要设计本工序
            switch (rollLineNo) {
            case ROLL_LINE_NO_10:
                procList.add("1R1");
            case ROLL_LINE_NO_20:
                procList.add("2R1");
            case ROLL_LINE_NO_30:
                procList.add("5R1");
            default:
                break;
            }
        }
        if(PdMatType.S.getCode().equals(matDesignKind) && slabNo.charAt(0) == 'E') {
            // 若组板类型为余坯组板且为复合坯/叠轧坯组板（即材料设计类型为S或L且板坯号第一位为E）时，根据产线号第三四位添加分张工序:
            switch (rollLineNo) {
            case ROLL_LINE_NO_10:
                procList.add("1X1");
            case ROLL_LINE_NO_20:
                procList.add("2X1");
            case ROLL_LINE_NO_30:
                procList.add("5X1");
            default:
                break;
            }
        }
        return procList ;
    }
    
    /**
     * 轧制小工序（第二道）
     * @return
     */
    public static String rollSmallProc(String rollLineNo) {
        switch (rollLineNo) {
        case ROLL_LINE_NO_10:
            return "1R1";
        case ROLL_LINE_NO_20:
            return "2R1";
        case ROLL_LINE_NO_30:
            return "5R1";
        default:
            return null;
        }
    }

    /**
     * 二次切断工序(余材板坯)
     * @param mscLineNo
     * @param slabNo PM_PD_SLAB_INFO.slabNo
     * @param ingotType PM_PD_SLAB_INFO.ingotType
     * @param stockLine WM_STOCK_INFO 库区类型stock_line）
     * @param matActLen
     * @param infurSlabLen
     * @return
     */
    public static String secondaryCuttingProc(String mscLineNo, String slabNo, String ingotType ,String stockLine, BigDecimal matActLen,
            BigDecimal infurSlabLen) {
        boolean needCalcProcFlag = true ;
        if(slabNo.charAt(0) == 'G') { // 余材钢锭
            if(StringUtils.isNotBlank(ingotType)) {
                // “根据板坯号查询板坯主数据主表中板坯类型为‘钢锭’的记录 轧钢该值集暂未确定10.14”存在时（不需要生成二切工序），不做处理
                needCalcProcFlag = false ;
            }
        } else {
            if(matActLen.compareTo(infurSlabLen.add(BigDecimal.valueOf(20))) <= 0) {
                // 进加热炉板坯最大长度+20 >= 材料实际长度,不做处理
                needCalcProcFlag = false ;
            }
        }
        if(needCalcProcFlag) {
            switch (stockLine) {
            case "1":
                return "1B2";
            case "2":
                return "2B2";
            case "5":
                return "5B2";
            default:
                return null;
            }
        }
        return null;
    }

    /**
     * 二次切断工序(出钢材)
     * 
     * @param mscLineNo    产线号
     * @param plateShpCode 形状代码
     * @return
     */
    public static String secondaryCuttingProc(String mscLineNo, String plateShpCode) {
        LineNoEnums lineNoEnums = LineNoEnums.getByMscLineNo(mscLineNo);
        if (STEEL_PL_00.equals(lineNoEnums.getSteelPl())) {
            switch (lineNoEnums.getRollLineNo()) {
            case ROLL_LINE_NO_10:
                return "1B1";
            case ROLL_LINE_NO_20:
                return "2B1";
            case ROLL_LINE_NO_30:
                return "5B1";
            default:
                return null;
            }
        } else {
            if (StringUtils.isNotBlank(plateShpCode)) {
                return "5B2";
            } else {
                return "5B1";
            }
        }
    }

}
