package com.eactive.eai.control;

import java.util.Properties;

import com.eactive.eai.adapter.ElinkAdapter;
import com.eactive.eai.adapter.ElinkAdapterFactory;
import com.eactive.eai.common.message.EAIMessageKeys;
import com.eactive.eai.common.tas.TASUtil;
import com.eactive.eai.common.util.Logger;

public class TasSocketSender {
	private static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
	static final String SOCK_CONTROL_ERROR = "RECEAIOSC001";
    
    public static byte[] callService(String adapterGroupName, Properties prop,  Object message, Properties tempProp) throws java.lang.Exception
    {
        byte[] resBytes; 
        try {
        	//new socket 과 old socket을 분기 하기 위해서
//        	String protocol = (String)prop.getProperty("protocol");
        	String tasBizCode = (String)prop.getProperty(EAIMessageKeys.TAS_BIZ_CODE);
        	
        	if(tasBizCode == null) {
            	throw new Exception("TAS_BIZ_CODE 값이 전달되지 않았습니다.");
            }
        	
            if(prop==null) {
                prop = new Properties();
            }           
            
            byte[] tasRequest = TASUtil.addTasHeader((byte[])message, tasBizCode) ;

            // 
            // 업무별어댑터 일 경우 어댑터의 업무코드를 등록하고 
            // 대표어댑터 일 경우에는 어댑터명을 어떻게 조회할지 확인 필요
//            AdapterGroupVO tasInfoAdapter = manager.getTasInfoAdapterGroupVO(tasBizCode, Keys.ADAPTER_OUT);
                        
            prop.setProperty("ADAPTER_GROUP_NAME", adapterGroupName);
            
            ElinkAdapterFactory factory = ElinkAdapterFactory.newInstance();            
            ElinkAdapter adapter = null;
           	adapter = factory.getElinkAdapter(com.eactive.eai.adapter.Keys.TYPE_NET2);
            resBytes = (byte[])adapter.callService(adapterGroupName, prop, tasRequest, tempProp);
            
            // TODO : 응답메시지에도 헤더가 있는지 확인필요
            // 2019.07.25 응답에도 헤더(업무코드)가 있는 것으로 확인
            if(resBytes != null && resBytes.length > 3) {
            	resBytes = TASUtil.removeTasHeader(resBytes);
            }
            
        } catch(Exception e) {
        	logger.error("callService error",e);
        	//throw new Exception(ExceptionUtil.getErrorCode(e, SOCK_CONTROL_ERROR));
            throw e;
        }
        return resBytes;
    }
}
