package com.kbstar.eai.common.header; 

import java.util.Arrays;

import com.eactive.eai.common.header.HeaderActionSupport;
import com.eactive.eai.common.server.Keys;
import com.eactive.eai.common.util.DatetimeUtil;
import com.eactive.eai.common.util.StringUtil;


/** 
* 1. 기능 : 연계기관 의 Header를 EAI에서 생성하거나 삭제해야하는 경우를 위한 Class
* 2. 처리 개요 : 
*     - 메시지종류에 따라 헤더를 생성하거나 삭제하는 API를 제공
* 3. 주의사항 
*     - AD 의 경우는 S는 ADD, R 는 DELETE
*     - DA 의 경우는 S는 DELETE, R 는 ADD
* @author  : 
* @version : v 1.0.0
* @see :
* @since : 
*/
public class THHCYUHeaderAction extends HeaderActionSupport 
{ 
    private static final int HEADER_LENGTH = 30; // 연계 - 기관간의 헤더Length
//    private static int mCount = 0;
    
    private static String tranSysDstcd;
    static {
    	String serverName = System.getProperty(Keys.SERVER_KEY);
    	tranSysDstcd = "1";
    	if(serverName != null && serverName.length() > 2) {
    		//juns 서버명 변경에 따른 인스턴스 룰 추출변경 
            //ex)EAIDSG_i11 => EAIDS01_i01
    		//tranSysDstcd = serverName.substring(serverName.length()-2, serverName.length()-1);
    		tranSysDstcd = serverName.substring(serverName.length()-5, serverName.length()-4);
    	}
    }
    public THHCYUHeaderAction(){
    	super.setHeaderLength(HEADER_LENGTH);
    	
    }
    
    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[] full        = null;
        	full = new byte[7 + message.length - HEADER_LENGTH];
        	byte [] header = new byte[7];

        	
    		byte[] hdr	= {'H', 'D', 'R'};
    		System.arraycopy(hdr, 0, header, 4, 3);
        	
    		//
    		System.arraycopy(header, 0, full, 0, 7 );
    		System.arraycopy(message, HEADER_LENGTH, full, 7, message.length-HEADER_LENGTH);
    		
    		
    		// 전체 전문길이 계산
    		byte len[] = Integer.toString( message.length +3 ).getBytes();
    		
    		
    		//길이값 '0'으로 셋팅
    		Arrays.fill(full, 0, 4, (byte)'0');
    		//길이값  value 셋팅
    		System.arraycopy(len, 0, full, 4 - len.length, len.length);     
     
            return full;
        }
        else {
            return message;
        }
    }
    
	public byte[] addHeaderDA(byte[] orgData , byte[] message ) {
		return addHeader(orgData,message);
	}
	public byte[] addHeaderAD(byte[] orgData , byte[] message ) {
		return addHeader(orgData,message);
    }   	

	public byte[] addHeader(byte[] orgData , byte[] message ) {
        String serviceCode       = "EAIKFTTA"; // 턱시도서비스코드(8)
        String sysMinHMSUnit     = ""; // 거래시간(12)
        //String tranSysDstcd      = "1"; // 거래처리시스템 구분(1)
        String tranLogRecrdEonot = "2"; // 거래log Dump 기록유무(1)
        String Blnk0             = "        "; // Filler (8)
        
        int msgLength = message.length + HEADER_LENGTH;
        
        sysMinHMSUnit = StringUtil.stringFormat(DatetimeUtil.getFormattedDate("MMDDHHmmssSSS"), false, ' ', 12);
        
        StringBuffer sb = new StringBuffer(30);
        sb.append(serviceCode);
        sb.append(sysMinHMSUnit);
        sb.append(tranSysDstcd);
        sb.append(tranLogRecrdEonot);
        sb.append(Blnk0);
        
        byte[] retHeader = new byte[msgLength];
        
        System.arraycopy(sb.toString().getBytes(), 0, retHeader, 0, HEADER_LENGTH);
        System.arraycopy(message, 7, retHeader, HEADER_LENGTH, retHeader.length-HEADER_LENGTH-7);
        return retHeader;		
	}

//	   public static void main(String args[]) throws Exception {
//	   test();
//}

// private static void test() throws Exception {
//		   String actionName = "com.kbstar.eai.common.header.THHCYUHeaderAction";
//		   
//
//		    /////전송 AD 
//	        HeaderAction action = HeaderActionFactory.createAction(actionName);
//
//	        Object[] bizObjs =new Object[1];
//	        bizObjs[0] = "HDR00001234567890".getBytes();
//	        Object bizObj = null;
//	        if(bizObjs != null && bizObjs.length > 0) {
//	            bizObj = bizObjs[0];
//	        }
//	        byte[] orgData = null; 
//			System.out.println("orgData=>"+new String(orgData==null?"".getBytes():orgData));
//			System.out.println("message=>"+new String(bizObj==null?"".getBytes():(byte[])bizObj));
//			System.out.println("sendRecv=>"+HeaderActionKeys.MESSAGE_SEND);
//			System.out.println("commandType=>"+HeaderActionKeys.ADD_DELETE_HEADER);	    
//			byte[] header = action.excute(orgData ,(byte[])bizObj, HeaderActionKeys.MESSAGE_SEND, HeaderActionKeys.ADD_DELETE_HEADER);
//			System.out.println("header=>"+new String(header));
//		   	/////////////
//		    
//		    /////수신 AD 
//
//		    bizObjs[0] = "EAIKFTTA135201896   12        1234567890".getBytes();
//	        if(bizObjs != null && bizObjs.length > 0) {
//	            bizObj = bizObjs[0];
//	        }
//	        orgData = null; 
//       	    //orgData = new byte[((byte[])bizObj).length ];
//   	 	    //System.arraycopy(((byte[])bizObj), 0, orgData, 0,orgData.length);
//			System.out.println("orgData=>"+new String(orgData==null?"".getBytes():orgData));
//			System.out.println("message=>"+new String(bizObj==null?"".getBytes():(byte[])bizObj));
//			System.out.println("sendRecv=>"+HeaderActionKeys.MESSAGE_RECV);
//			System.out.println("commandType=>"+HeaderActionKeys.ADD_DELETE_HEADER);	        
//	        
//            header = action.excute(orgData ,(byte[])bizObj, HeaderActionKeys.MESSAGE_RECV, HeaderActionKeys.ADD_DELETE_HEADER);
//            System.out.println("header=>"+new String(header));
//	    }	
} 

