package com.eactive.eai.adapter.wca.data;

import com.eactive.eai.adapter.wca.SNAProperties;
import com.eactive.eai.adapter.wca.exception.WCAException;
import com.eactive.eai.adapter.wca.util.MyUtil;

/** 
* 1. 기능 : Softlink와 데이타 송수신에 필요한 정보
* 2. 처리 개요 : 
* 3. 주의사항
*
* @author  : 
* @version : v 1.0.0
* @see : 
* @since   : 2005. 6. 23. 오전 11:16:42
*/
public class WCAHeader implements SNAProperties {   
    /**
     *  Transaction 키 길이
     */
	public static final int LEN_TRAN_KEY    = 40;
    
    /**
     * LU  이름 길이
     */
	public static final int LEN_LUNAME      = 8;
    
    /**
     * 호출 모드 (Response/Non-response) 길이
     */
	public static final int LEN_MODE        = 1;
    
    /**
     * HOST 수신 데이터의 종류 길이
     */
	public static final int LEN_DATA_TYPE      = 2;
	
	
    /**
     *  Transaction 키 Offset
     */
	public static final int OFFSET_TRAN_KEY = 0;
    
    /**
     * LU  이름 Offset
     */
	public static final int OFFSET_LUNAME = LEN_TRAN_KEY;
    
     /**
     * 호출 모드 (Response/Non-response) Offset
     */
	public static final int OFFSET_MODE = OFFSET_LUNAME + LEN_LUNAME;
    
    /**
     * HOST 수신 데이터의 종류 Offset
     */
	public static final int OFFSET_DATA_TYPE = OFFSET_MODE + LEN_MODE;
	
    /**
     * WCA Header 크기
     */
	public static final int WCA_HEADER_LEN = OFFSET_DATA_TYPE + LEN_DATA_TYPE;

    /**
     * Tran Key가 null
     */
    public static final byte[] NULL_TRANKEY = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                              0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                              0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                              0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    
    /**
     * LU 이름이 null
     */
    public static final byte[] NULL_TSNAME = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
            
   /** 
    * 1. 기능 : Header 정보 반환
    * 2. 처리 개요 : 
    * 3. 주의사항 
    * 
    * @return Header 정보
    **/                                        
	public String toString() {
	    StringBuffer sbTmp = new StringBuffer();
	
	    sbTmp.append(getKey() + ", " + getLUName() + ", " + getMode() + ", " + getDataType());
	    return sbTmp.toString();
	}
	
    /**
     *  Header 길이
     */
	int		nLen = 0;
    
    /**
     * Header 데이타
     */
	byte[]	pHeaderBuff = null;
	
    /** 
    * 1. 기능 : WCA Header Constructor
    * 2. 처리 개요 : 
    * 3. 주의사항 
    * 
    * @param nLen            header 길이
    * @param pBuff           header 데이타
    **/
    public WCAHeader(int nLen, byte[] pBuff) {
        this.nLen = nLen;
        this.pHeaderBuff = pBuff;
    }

   /** 
    * 1. 기능 : WCA Header default Constructor
    * 2. 처리 개요 :
    * 3. 주의사항 
    **/
    public WCAHeader() {
        this.nLen = WCA_HEADER_LEN;
        this.pHeaderBuff = new byte[WCA_HEADER_LEN];        
        
        for (int i = 0; i <  WCA_HEADER_LEN; i++) {
            pHeaderBuff[i] = (byte)0x00;
        }        
    }
    
    /** 
    * 1. 기능 : Header 데이타 반환
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @return Header 데이타
    **/
    public byte[] getHeader() {
        return pHeaderBuff;
    }    
    
   /** 
    * 1. 기능 : 트랜잭션 키 반환
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @return 트랜잭션 키
    **/
    public String getKey() {
        byte[] pBuff = new byte[LEN_TRAN_KEY];
        
        System.arraycopy(pHeaderBuff, OFFSET_TRAN_KEY, pBuff, 0, LEN_TRAN_KEY);
        
        String sHeaderField = new String(pBuff);        
        return sHeaderField;
    }
    
    /** 
    * 1. 기능 : 트랜잭션 키 설정
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @param 트랜잭션 키
    **/
    public void setKey(String key) throws WCAException {
        if (key == null) {
            throw new WCAException(WCAException.E_SEND_DATA_ERROR, "Transaction Key");
        }
        
        // TRAN KEY Space로 채움
        key = MyUtil.rightPadString(key, LEN_TRAN_KEY, " ");
    
        byte[] pBuff = key.getBytes();       
        System.arraycopy(pBuff, 0, pHeaderBuff, OFFSET_TRAN_KEY, LEN_TRAN_KEY);
    }
    
    /** 
    * 1. 기능 : LU 이름 반환
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @return LU 이름
    **/
    public String getLUName() {
        byte[] pBuff = new byte[LEN_LUNAME];
        
        System.arraycopy(pHeaderBuff, OFFSET_LUNAME, pBuff, 0, LEN_LUNAME);
        
        String sHeaderField = new String(pBuff);
        
        return sHeaderField;
    }
    
    /** 
    * 1. 기능 : LU 이름 설정
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @param LU 이름
    **/
    public void setLUName(String tsname) throws WCAException {
        try {
            if (tsname == null) { tsname = ""; }            
            byte[] pBuff = tsname.getBytes();
        
            int nLen = pBuff.length;        
            if (nLen > LEN_LUNAME) {
                nLen = LEN_LUNAME;
            }
            System.arraycopy(pBuff, 0, pHeaderBuff, OFFSET_LUNAME, nLen);     
        }
        catch (Exception e) {
            throw new WCAException(WCAException.E_SEND_DATA_ERROR, "LU NAME");
        }
    }
    
    /** 
    * 1. 기능 : 호출 모드 반환
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @return 호출 모드
    **/
    public char getMode() {
        return (char)pHeaderBuff[OFFSET_MODE];
    }
    
    /** 
    * 1. 기능 : 호출 모드 설정
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @param 호출 모드
    **/
    public void setMode(String mode) throws WCAException {
        if (mode == null) {
            throw new WCAException(WCAException.E_SEND_DATA_ERROR, "호출모드");
        }
        
        mode = MyUtil.rightPadString(mode, LEN_MODE, " ");
        byte[] pBuff = mode.getBytes();      
        System.arraycopy(pBuff, 0, pHeaderBuff, OFFSET_MODE, LEN_MODE);
    }
    
   /** 
    * 1. 기능 : host 수신 데이타 종류 반환
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @return host 수신 데이타 종류 
    **/
    public String getDataType() {
        byte[] pBuff = new byte[LEN_DATA_TYPE];
        
        System.arraycopy(pHeaderBuff, OFFSET_DATA_TYPE, pBuff, 0, LEN_DATA_TYPE);
        
        String sHeaderField = new String(pBuff);
        
        return sHeaderField;        
    }
    
    /** 
    * 1. 기능 : host 수신 데이타 종류 설정
    * 2. 처리 개요 :
    * 3. 주의사항 
    * 
    * @param host 수신 데이타 종류
    **/
    public void setDataType(String status) {
        if (status == null) { status = ""; }        
        status = MyUtil.rightPadString(status, LEN_DATA_TYPE, " ");
        
        byte[] pBuff = status.getBytes();        
        System.arraycopy(pBuff, 0, pHeaderBuff, OFFSET_DATA_TYPE, LEN_DATA_TYPE);
    }
}
