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

import java.util.Stack;

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


public class SamsungPayNSHCDecode extends PostfixMathCommand {
    public SamsungPayNSHCDecode() {
        numberOfParameters = 2;
    }

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

    	//NSHC 복호화 컬럼은 param2 로 받고, 그에 대한 키값(RSA복호화)을 param1로 받음 (stack이라 순서 반대)
        //key value
    	Object param1 = inStack.pop();
        //Data
    	Object param2 = inStack.pop();

        byte[] value = null;
        byte[] key = null;

        if (param2 instanceof String) {
            value = ((String) param2).getBytes();
        } else if (param2 instanceof byte[]) {
            value = (byte[]) param2;
        } else if (param2 instanceof Double) {
        	if (((Double) param2).doubleValue() == Math.round(((Double) param2).doubleValue())) {
        		value = new Long(Math.round(((Double) param2).doubleValue())).toString().getBytes();
        	} else {
                value =((Number) param2).toString().getBytes();
        	}
        } else if (param2 instanceof Number) {
            value = ((Number) param2).toString().getBytes();
        } else if (param2 == null) {
            inStack.push(new byte[0]);
//            System.out.println("NSHC : Data is NULL");
            return;
        } else {
            throw new ParseException("Data 값이  byte[], String이 아닙니다. : " + param2);
        }


        if (param1 instanceof String) {
            key = ((String) param1).getBytes();
        } else if (param1 instanceof byte[]) {
        	key = (byte[]) param1;
        } else if (param1 instanceof Double) {
        	if (((Double) param1).doubleValue() == Math.round(((Double) param1).doubleValue())) {
        		key = new Long(Math.round(((Double) param1).doubleValue())).toString().getBytes();
        	} else {
        		key =((Number) param1).toString().getBytes();
        	}
        } else if (param1 instanceof Number) {
        	key = ((Number) param1).toString().getBytes();
        } else if (param1 == null) {
        	inStack.push(new byte[0]);
//            System.out.println("NSHC : Key value is NULL");
            return;
        } else {
            throw new ParseException("Key 값이  byte[], String이 아닙니다. : " + param1);
        }
        
        // param2의 복호화 키값을 파라메터로 하여 param1 NSHC복호화
        try {
//        	NFilter nfilter = new NFilter();
//        	byte[] res = nfilter.decNum(new String(key), new String(value)).getBytes();
//        	inStack.push(res);
        } catch (Exception e) {
            //throw new ExecutionException(e.getMessage(), parameters, e);
            throw new ParseException(e.getMessage(), e);
        }    	
    }
    
    
}