package com.kbstar.eai.inbound.action; 

import com.eactive.eai.adapter.AdapterGroupVO;
import com.eactive.eai.adapter.AdapterManager;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.common.util.MessageKeyExtractor;
import com.eactive.eai.inbound.action.ActionException;
import com.eactive.eai.inbound.action.RequestActionSupport;

/** 
* 1. 기능 : Inbound Adapter를 통해 전달받은 비표준메시지에서 KESA를 생성하기 위한 키값을 추출
* 2. 처리 개요 : 
*     - 어뎁터의 업무그룹드를 키값앞에 추가한다.
*     - MessageKeyExtractor를 통해 Adapter별 추출 Rule에 따라 메시지를 구분할 수 있는 키값을 추출한다.
*     - EBE(타행환)업무로직이 추가됨
* 3. 주의사항 
*
* @author  : 
* @version : v 1.0.0
* @see :
* @since : 
*/
public class EBEAdapterRequestAction extends RequestActionSupport
{ 
    /** 
	* 1. 기능 : Inbound Adapter를 통해 전달받은 비표준메시지에서 KESA를 생성하기 위한 키값을 추출
	* 2. 처리 개요 : 
	*     - MessageKeyExtractor를 통해 Adapter별 추출 Rule에 따라 메시지를 구분할 수 있는 키값을 추출한다.
    * 3. 주의사항 
    *
    * @param message Object 타입의 요청메시지
    * @return String 비표준메시지의 메시지키값
    * @exception
    **/
    public String[] perform(Object message) throws ActionException
    {
        byte[] tmp = null;
        String[] key = null;
        
        AdapterManager adapterManager = AdapterManager.getInstance();
        AdapterGroupVO adptGrpVO = adapterManager.getAdapterGroupVO(adapterGroupName);        
        String eaiBizCode = null;
        if(adptGrpVO != null) {
        	eaiBizCode = adptGrpVO.getEaiBizCode();
        }
        else {
        	eaiBizCode = getEaiBizCodeFromAdapterName(adapterGroupName);
        }
        

        
        if(message instanceof byte[]) {
        	tmp = (byte[])message;
            if (logger.isInfo()) logger.info(adapterName+"] received data >> "+ new String(tmp));
            
        	try  {
            	// 연계확인 로직 후 연계가 아닌 경우 등록한 룰을 통해 메시지키를 추출한다. 
                /*
                tcp_length[4],               // 0
        		tcp_hdr[3],                  // 4
        		system_id[2],                // 7    
                bank_code[3],                // 9    
                jeonmun_code[4],             // 12   
                gubun_code[3],               // 16   
                send_rcv_flag,               // 19   
                rsp_code[3],                 // 20   
                acquire_bank_code[3],        // 23   취급은행코드 
                acquire_jumpo_code[4],       // 26   취급지점코드 
                acquire_gwanri_no[6],        // 30   취급관리번호 
                acquire_jeonmun_time[12],    // 36   취급전문시간 
                kft_gwanri_no[9],            // 48   중계관리번호 
                kft_jeonmun_time[12],        // 57   중계전문시간 
                issue_bank_code[3],          // 69   개설은행코드 
                issue_jumpo_code[4],         // 72   개설지점코드 
                issue_gwanri_no[6],          // 76   개설관리번호 
                issue_jeonmun_time[12],      // 82   개설전문시간 
                reserve[MAX_TRAN_LEN-92];    // 94

         if ((strncmp(text.system_id,    "03",      2) == 0) &&
                    ((strncmp(text.jeonmun_code, "0200500", 7) == 0) ||
                     (strncmp(text.jeonmun_code, "9210500", 7) == 0)))
                     {
                     memset(yun_gae, (char)NULL, sizeof(yun_gae));
                     memcpy(yun_gae, text.reserve+12, 14);
                     status = Yun_Gae_Chk(yun_gae);
                     if (status == 0)      // 연계계좌 
        */
            	String system_id    = new String(tmp, 7, 2);
            	String jeonmun_code = new String(tmp, 12, 7);
            	
            	if("03".equals(system_id) &&
            		( "0200500".equals(jeonmun_code) || "9210500".equals(jeonmun_code)) ) {
            		int status = Yun_Gae_Chk(tmp);
            		
           		 	if (status == 0) {
           		 		key = new String[1];
           		 		key[0] = jeonmun_code + "CYU";
           		 	}
           		 	else {
           		 		key = MessageKeyExtractor.getMessageKeyValue(this.adapterGroupName, message); 
           		 	}
            	}
            	else {
            		key = MessageKeyExtractor.getMessageKeyValue(this.adapterGroupName, message);
            	}
            } catch(Exception e) {
            	if (logger.isError()) logger.info(adapterName+"] EBEAdapterRequestAction "+ e.getMessage());   
                throw new ActionException(ExceptionUtil.getErrorCode(e, "RECEAIIRA001"));
            }
             
        } else {
        	if (logger.isInfo()) logger.info(adapterName+"] received data >> "+ message);
        	try  {
                key = MessageKeyExtractor.getMessageKeyValue(this.adapterGroupName, message);  
            } catch(Exception e) {
            	if (logger.isError()) logger.info(adapterName+"] EBEAdapterRequestAction "+ e.getMessage());   
                throw new ActionException(ExceptionUtil.getErrorCode(e, "RECEAIIRA001"));
            }  
        }
        
        for(int i=0; i<key.length; i++) {
        	key[i] = eaiBizCode.trim() + key[i];
        }
            
        return key;
    }
    
    public int Yun_Gae_Chk(byte[] message) {

    	int yun_gae_offset = 94 + 13; // 수취조회번호 12 -> 13
		
		if( (bytesncmp(message, yun_gae_offset +  9 , " ")) ||
			(bytesncmp(message, yun_gae_offset + 10 , " ")) ||
			(bytesncmp(message, yun_gae_offset + 11 , " "))) {
	        return -1;
		}
		
		if( bytesncmp(message, yun_gae_offset + 12, "  ")) {
	        if ((bytesncmp(message, yun_gae_offset + 3, "07")) ||
	            (bytesncmp(message, yun_gae_offset + 3, "08")) ||
	            (bytesncmp(message, yun_gae_offset + 3, "26"))) {
	            return 0; // 연계
	        }
		}
		else if ( ( bytesncmp(message, yun_gae_offset + 12, "  ") ) == false) {
	        if (bytesncmp(message, yun_gae_offset + 4, "90")) {
	            return 0; // 연계           
	        }
		} 
		return -1;
	}
    	
	public boolean bytesncmp(byte[] src, int startPos, String value) {
		
		if(value == null || value.length() < 1) {
			return false;
		}

		byte[] valueBytes = value.getBytes();
		int valueBytesLength = valueBytes.length;
		
		if(src == null || src.length <(startPos + valueBytesLength)) {
			return false;
		}
		
		byte[] cmpareBytes = new byte[valueBytesLength];
		
		System.arraycopy(src, startPos, cmpareBytes, 0, cmpareBytes.length );
		if(value.equals(new String(cmpareBytes))) {
			return true;
		}
		
		return false;
	}
	
	public String getDescription() {
		return "키추출방식 : 연계계좌 확인 - 어댑터업무코드[3]+전문번호[7] +CYU , 아닐 경우 어댑터업무코드[3]+추출키값";
	}
} 
