package com.eactive.eai.transformer.function.convert;

import java.util.Stack;

import org.nfunk.jep.ParseException;
import org.nfunk.jep.function.PostfixMathCommand;

import com.eactive.eai.transformer.util.IConv;


/**
 * EBCDIC 값을 ASCII으로 변환하는 함수
 * 입력 값은 byte[], 결과는 byte[]임.
 */
public class EBCDIC2ASCIISS extends PostfixMathCommand {
    public EBCDIC2ASCIISS() {
        numberOfParameters = 1;
    }

    public void run(Stack inStack) throws ParseException {
        checkStack(inStack);

        Object param = inStack.pop();
        byte[] value = null;
        try {
            if (param instanceof String) {
                value = ((String) param).getBytes();
            } else if (param instanceof byte[]) {
                value = (byte[]) param;
            } else if (param instanceof Double) {
            	if (((Double) param).doubleValue() == Math.round(((Double) param).doubleValue())) {
            		value = new Long(Math.round(((Double) param).doubleValue())).toString().getBytes();
            	} else {
                    value =((Number) param).toString().getBytes();
            	}
            } else if (param instanceof Number) {
                value = ((Number) param).toString().getBytes();
            } else if (param == null) {
//                inStack.push(null);
//                return;
            	inStack.push(new byte[0]);
            	return;
            } else {
                throw new ParseException("Function의 파라미터 인수가 byte[], String이 아닙니다. : " + param);
            }
            
            // 2009.12.02 강길수 차장 요청
            // 첫바이트가 EBCDIC 4(0xF4)이면 SI에 Space 2자를 패딩하도록 변환
            // 첫 바이트는 데이터에서 제외된다.
            // ASCII 기본형
            byte flag = value[0];
            
            byte[] cutBytes = new byte[value.length -1];
            System.arraycopy(value, 1, cutBytes, 0, cutBytes.length);
            
            if(flag == (byte)0xF4) {
            	inStack.push(IConv.ebcdicToASCIISIDoubleSpace(cutBytes).getBytes());
            }
            else {
            	inStack.push(IConv.ebcdicToASCII(cutBytes).getBytes());
            }
            
        } catch (Exception e) {
            //throw new ExecutionException(e.getMessage(), parameters, e);
            throw new ParseException(e.getMessage(), e);
        }
    }
}
