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

import java.util.Stack;

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

import com.eactive.eai.common.property.PropManager;

import java.nio.charset.StandardCharsets;

// kj bank import 2025-09-23 jwhong
import com.eactive.eai.common.seed.SeedKJ;
import com.eactive.eai.common.seed.SeedCipher;
import org.apache.commons.lang3.StringUtils;
import java.util.Base64;
//import org.kjbank.simple.core.crypto.seed.SeedUtil; 

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

    public void run(Stack inStack) throws ParseException {
        checkStack(inStack);
        
        // PROPERTY 에서 가져와야 하나      
		//PropManager propManager = PropManager.getInstance();
		//String safeDbPath = propManager.getProperty("SafeDB","safedb.path");
        
        SeedCipher seedCiper = new SeedCipher();
        
        // 아니면 USER FUNCTION에서 Parameter 에서 가져와야 하나 
        Object param2 = inStack.pop();
        String param2Str = String.valueOf(param2); // null 안전 처리      
        String encryptKey = StringUtils.leftPad(param2Str, 16, '0');

        Object param = inStack.pop();

        byte[] value = null;

        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;
        } else {
            throw new ParseException("Function의 파라미터 인수가 byte[] 또는 String이 아닙니다. : " + param);
        }

        try {
        	//byte[] bbb =seedCiper.encrypt(new String(value, StandardCharsets.UTF_8), encryptKey.getBytes());
        	//String encryptedData = Base64.getEncoder().encodeToString(bbb);
        	String encryptedData = SeedKJ.encrypt(new String(value, StandardCharsets.UTF_8), encryptKey);
        	
            //String encryptedData = SeedUtil.encrypt(new String(value, StandardCharsets.UTF_8),encryptKey);
        	
        	inStack.push(encryptedData);
        } catch (Exception e) {
            //throw new ExecutionException(e.getMessage(), parameters, e);
            throw new ParseException(e.getMessage(), e);
        }    	
    }
}