package com.eactive.eai.batch.telegram;

import java.io.Serializable;
import java.util.HashMap;

public class TelegramVO implements Serializable
{
    private static final long serialVersionUID = 1L;

    /**
     *  전문의 Key
     */
    private String telegramKey;

    /**
     *  전문 필드의 각 길이들의 배열
     */
    private String[] telegramFieldLengths;

    /**
     *  전문 필드가 가변부를 가지는지를 판단하는 태그
     *  true: 가변부가 있는 전문, false: 가변부가 없는 전문
     */
    private boolean variableFieldCheckTag;

    /**
     *  전문 아이템의 내용 - TelegramItemVO의 배열로 구성된다.
     */
    private HashMap<Integer, TelegramItemVO> itemVOs;


    /* *********************** 생성자 *********************** */

    /**
     * 1. 기능 : Defualt Constructor
     * 2. 처리 개요 :
     *    - Defualt Constructor
     * 3. 주의사항
     *
     **/
    public TelegramVO() {
    }

    /**
     * 1. 기능 : Constructor, 전문 Key와 필드 집합으로 생성
     * 2. 처리 개요 :
     *    - EAI 서버 이름을 저장하는 생성자 함수
     * 3. 주의사항
     *
     * @param
     **/
    public TelegramVO(String telegramKey, HashMap<Integer, TelegramItemVO> itemVOs) {
        this.telegramKey = telegramKey;
        this.telegramFieldLengths = new String[itemVOs.size()];
        this.variableFieldCheckTag = false;
        this.itemVOs = itemVOs;
    }

    /**
     * 1. 기능 : Constructor, 전문 Key로 생성
     * 2. 처리 개요 :
     *    - EAI 서버 이름을 저장하는 생성자 함수
     * 3. 주의사항
     *
     * @param   telegramKey     전문의 Key
     **/
    public TelegramVO(String telegramKey, int fieldCount) {
        this.telegramKey = telegramKey;
        this.telegramFieldLengths = new String[fieldCount];
        this.variableFieldCheckTag = false;
        this.itemVOs = new HashMap<Integer, TelegramItemVO>();
    }

    /* *********************** GET, SET 함수 *********************** */

    /**
     * 1. 기능 : telegramKey를 세팅하는 setter 메소드
     * 2. 처리 개요 :
     * 3. 주의사항
     *
     * @return
     **/
    public void setTelegramKey(String telegramKey) {
        this.telegramKey = telegramKey;
    }

    /**
     * 1. 기능 : Rule Key를 반환하는 getter method
     * 2. 처리 개요 :
     *    - Rule Key를 반환한다.
     * 3. 주의사항
     *
     * @return
     **/
    public String getTelegramKey() {
        return this.telegramKey;
    }


    /**
     * 1. 기능 : 전문을 구성하는 필드의 갯수를 반환한다.
     * 2. 처리 개요 :
     *    - 전문 필드로 구성되는 HashMap의 사이즈를 반환한다.
     * 3. 주의사항
     *
     **/
    public int getFieldSize() {
        return this.itemVOs.size();
    }

    /**
     * 1. 기능 : 전문의 필드중에 가변부가 있는지를 판단하는 태그
     * 2. 처리 개요 :
     *    - 전문 필드중 가변부의 존재 여부를 반환한다.
     *    - true: 가변부가 있는 전문, false: 가변부가 없는 전문
     * 3. 주의사항
     *
     **/
    public void setVariableFieldCheckTag(boolean tag)
    {
        this.variableFieldCheckTag = tag;
    }

    /**
     * 1. 기능 : 전문의 필드중에 가변부가 있는지를 판단하는 태그
     * 2. 처리 개요 :
     *    - 전문 필드중 가변부의 존재 여부를 반환한다.
     *    - true: 가변부가 있는 전문, false: 가변부가 없는 전문
     * 3. 주의사항
     *
     **/
    public boolean getVariableFieldCheckTag()
    {
        return this.variableFieldCheckTag;
    }

    /**
     * 1. 기능 : 전문 필드의 길이로 구성된 배열을 반환한다.
     * 2. 처리 개요 :
     *    -
     * 3. 주의사항
     *
     **/
    public String[] getTelegramFieldLengthsArray()
    {
        String lengthsarray[] = new String[itemVOs.size()];
        for(int i=0; i<itemVOs.size(); i++)
        {
            TelegramItemVO itemVo = itemVOs.get(new Integer(i+1));
            lengthsarray[i] = itemVo.getFieldLength();
        }
        return lengthsarray;
    }

    /**
     * 1. 기능 : 전문 필드의 타입으로 구성된 배열을 반환한다.
     * 2. 처리 개요 :
     *    -
     * 3. 주의사항
     *
     **/
    public String[] getTelegramFieldTypesArray()
    {
        String typessarray[] = new String[itemVOs.size()];
        for(int i=0; i<itemVOs.size(); i++)
        {
            TelegramItemVO itemVo = (TelegramItemVO)itemVOs.get(new Integer(i+1));
            typessarray[i] = itemVo.getFieldType();
        }
        return typessarray;
    }

    public String[] getTelegramFieldIDsArray()
    {
        String idsarray[] = new String[itemVOs.size()];
        for(int i=0; i<itemVOs.size(); i++)
        {
            TelegramItemVO itemVo = (TelegramItemVO)itemVOs.get(new Integer(i+1));
            idsarray[i] = itemVo.getFieldID();
        }
        return idsarray;
    }

    public String[] getTelegramFieldNamesArray()
    {
        String namessarray[] = new String[itemVOs.size()];
        for(int i=0; i<itemVOs.size(); i++)
        {
            TelegramItemVO itemVo = (TelegramItemVO)itemVOs.get(new Integer(i+1));
            namessarray[i] = itemVo.getFieldName();
        }
        return namessarray;
    }

    /**
     * 1. 기능 : 전문 필드는 순서를 가지며, 입력한 순서의 필드를 반환한다.
     * 2. 처리 개요 :
     *    - HashMap으로 구성되는 itemVOs는 반드시 전문의 순서대로 입력되어야 한다.
     * 3. 주의사항
     *
     * @return   필드객체-TelegramItemVO
     **/
    public TelegramItemVO getTelegramItem(int index) {
        TelegramItemVO itemVo = (TelegramItemVO)itemVOs.get(new Integer(index));
        return itemVo;
    }

    /**
     * 1. 기능 : 새로운 필드를 추가하는 메소드
     * 2. 처리 개요 :
     *    - HashMap itemVOs는 반드시 Key로 순차적인 숫자를 가져야 한다.
     *
     * 3. 주의사항
     *    - 반환값 int는 하나의 필드를 추가한 다음 필드의 갯수를 반환한다.
     *
     * @param   telegramKey, telegramItemVO     전문의 Key, 전문 필드
     **/
    public int addTelegramItem(TelegramItemVO telegramItemVO)
    {
        int seqNo = this.getFieldSize();

        // 필드 길이를 telegramFieldLengths 배열에 추가한다.
        this.telegramFieldLengths[seqNo] = telegramItemVO.getFieldLength();

        // 필드를 HashMap에 추가한다.
        itemVOs.put(new Integer(seqNo+1), telegramItemVO);

        // 디버깅을 위하여 필드를 추가하고 현재 필드의 갯수를 반환한다.
        return this.getFieldSize();
    }


    public String toString()
    {
        String str = "";
        str += "전문 코드: " + this.getTelegramKey() + ", ";
        str += "필드 갯수: " + this.getTelegramFieldLengthsArray().length + ", ";
        str += "가변 여부: " + this.getVariableFieldCheckTag();
        return str;
    }

}