package com.eactive.eai.common.header; 

import com.eactive.eai.common.util.Logger;


/** 
* 1. 기능 : 공통부 Header를 EAI에서 생성하거나 삭제해야하는 경우를 위한 Utility Class
* 2. 처리 개요 : 
*     - 메시지종류에 따라 헤더를 생성하거나 삭제하는 API를 제공
* 3. 주의사항 
*     - AD 의 경우는 S는 ADD, R 는 DELETE
*     - DA 의 경우는 S는 DELETE, R 는 ADD
* @author  : 
* @version : v 1.0.0
* @see :
* @since : 
*/
public abstract class HeaderActionSupport implements HeaderAction 
{ 
	private int HEADER_LENGTH = 0;

    static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
	
	
	public void HeaderAction(){

	}
	public int getHeaderLength(){
		return this.HEADER_LENGTH;
	}
	public void setHeaderLength(int headerLength){
		this.HEADER_LENGTH = headerLength;
	}	
    /**
     *  input message로 부터 헤더추가 삭제한 메시지를 반환한다.
     */
    public byte[] excute( byte[] orgData,   byte[] message, String sendRecv, String commandType){

//    	if(logger.isDebug()) {
//        	logger.debug("HeaderActionSupport] orgData=>"+new String(orgData==null?"".getBytes():orgData));
//        	logger.debug("HeaderActionSupport] message=>"+new String(message==null?"".getBytes():message));
//        	logger.debug("HeaderActionSupport] sendRecv=>"+sendRecv);
//        	logger.debug("HeaderActionSupport] commandType=>"+commandType);
//        }
    	
        if(HeaderActionKeys.ADD_DELETE_HEADER.equals(commandType)) {
        	if(HeaderActionKeys.MESSAGE_SEND.equals(sendRecv)) {
                    return addHeaderAD(orgData , message );
            }
        	else if(HeaderActionKeys.MESSAGE_RECV.equals(sendRecv)) {
                return deleteHeaderAD(message, getHeaderLength());
        		
        	}
            else {
                return message;
            }
        }
        else if(HeaderActionKeys.DELETE_ADD_HEADER.equals(commandType)) {
            if(HeaderActionKeys.MESSAGE_SEND.equals(sendRecv)) {
                return deleteHeaderDA(message, getHeaderLength());
            }
        	else if(HeaderActionKeys.MESSAGE_RECV.equals(sendRecv)) {
                return addHeaderDA(orgData , message );
        		
        	}
            else {
                return message;
            }     
        }
        else {
        	return message;
        }    	
    }
    public byte[] deleteHeaderAD(byte[] message, int headerLength) {
    	return deleteHeader(message,headerLength);
    }
    public byte[] deleteHeaderDA(byte[] message, int headerLength) {
    	return deleteHeader(message,headerLength);
    }
    
    public byte[] deleteHeader(byte[] message, int headerLength) {
        int msgLength = message.length - headerLength;
        if(msgLength > 0) {
            byte[] retHeader = new byte[msgLength];        
            System.arraycopy(message, headerLength, retHeader, 0, retHeader.length);            
            return retHeader;
        }
        else {
            return message;
        }
    }

    abstract public byte[] addHeaderDA(byte[] orgData , byte[] message ) ;
    abstract public byte[] addHeaderAD(byte[] orgData , byte[] message ) ;
    
} 

