package com.eactive.eai.transformer.util;

import java.util.HashMap;
import java.util.Map;

import com.eactive.eai.transformer.function.Function;
import com.eactive.eai.transformer.layout.Item;
import com.eactive.eai.transformer.layout.Types;

/**
 * 운영관리 화면에서 사용하기 위해 Transformer내의 Function, Layout, Transform 등에서 사용되는 상수들 정의
 */
public class TransformKeys {
	private TransformKeys() {

	}

	/**
	 * 변환함수 반환 유형 ID를 위한 Map 반환하는 메서드
	 */
	private static Map<String, String> ccnvsnRetunID = new HashMap<>();

	public static Map<String, String> getCnvsnRetunID() {
		ccnvsnRetunID.put("UNKNOWN", "" + Types.TYPE_UNKNOWN);
		ccnvsnRetunID.put("STRING", "" + Types.TYPE_STRING);
		ccnvsnRetunID.put("INT", "" + Types.TYPE_INT);
		ccnvsnRetunID.put("LONG", "" + Types.TYPE_LONG);
		ccnvsnRetunID.put("SHORT", "" + Types.TYPE_SHORT);
		ccnvsnRetunID.put("DOUBLE", "" + Types.TYPE_DOUBLE);
		ccnvsnRetunID.put("FLOAT", "" + Types.TYPE_FLOAT);
		ccnvsnRetunID.put("CHAR", "" + Types.TYPE_CHAR);
		ccnvsnRetunID.put("BYTE", "" + Types.TYPE_BYTE);
		ccnvsnRetunID.put("DATE", "" + Types.TYPE_DATE);
		ccnvsnRetunID.put("TIME", "" + Types.TYPE_TIME);
		ccnvsnRetunID.put("TIMESTAMP", "" + Types.TYPE_TIMESTAMP);
		ccnvsnRetunID.put("NUMBER", "" + Types.TYPE_NUMBER);
		ccnvsnRetunID.put("BYTEARRAY", "" + Types.TYPE_BYTEARRAY);
		ccnvsnRetunID.put("NUMERIC", "" + Types.TYPE_NUMBER);
		ccnvsnRetunID.put("PACKDECIMAL", "" + Types.TYPE_PACKDECIMAL);
		ccnvsnRetunID.put("OBJECT", "" + Types.TYPE_OBJECT);
		ccnvsnRetunID.put("BOOLEAN", "" + Types.TYPE_BOOLEAN);
		ccnvsnRetunID.put("BIGDECIMAL", "" + Types.TYPE_BIGDECIMAL);

		return ccnvsnRetunID;
	}

	//
	/**
	 * 변환함수 유형 ID를 위한 Map 반환하는 메서드
	 **/
	private static Map<String, String> ccnvsnTypeID = new HashMap<>();

	public static Map<String, String> getCnvsnTypeID() {
		ccnvsnTypeID.put("BUILTIN", "" + Function.TYPE_BUILTIN);
		ccnvsnTypeID.put("PRIMITIVE", "" + Function.TYPE_PRIMITIVE);
		ccnvsnTypeID.put("GENERIC", "" + Function.TYPE_GENERIC);
		ccnvsnTypeID.put("CONVERT", "" + Function.TYPE_CONVERT);
		ccnvsnTypeID.put("USERDEFINED", "" + Function.TYPE_USERDEFINED);

		return ccnvsnTypeID;
	}

	/**
	 * 변환함수파라미터유형ID를 위한 Map 반환하는 메서드
	 */
	private static Map<String, String> ccnvsnParmTypeID = new HashMap<>();

	public static Map<String, String> getCnvsnParmTypeID() {

		ccnvsnParmTypeID.put("STRING", "" + Types.TYPE_STRING);
		ccnvsnParmTypeID.put("INT", "" + Types.TYPE_INT);
		ccnvsnParmTypeID.put("LONG", "" + Types.TYPE_LONG);
		ccnvsnParmTypeID.put("SHORT", "" + Types.TYPE_SHORT);
		ccnvsnParmTypeID.put("DOUBLE", "" + Types.TYPE_DOUBLE);
		ccnvsnParmTypeID.put("FLOAT", "" + Types.TYPE_FLOAT);
		ccnvsnParmTypeID.put("CHAR", "" + Types.TYPE_CHAR);
		ccnvsnParmTypeID.put("BYTE", "" + Types.TYPE_BYTE);
		ccnvsnParmTypeID.put("DATE", "" + Types.TYPE_DATE);
		ccnvsnParmTypeID.put("TIME", "" + Types.TYPE_TIME);
		ccnvsnParmTypeID.put("TIMESTAMP", "" + Types.TYPE_TIMESTAMP);
		ccnvsnParmTypeID.put("NUMBER", "" + Types.TYPE_NUMBER);
		ccnvsnParmTypeID.put("BYTEARRAY", "" + Types.TYPE_BYTEARRAY);
		ccnvsnParmTypeID.put("NUMERIC", "" + Types.TYPE_NUMBER);
		ccnvsnParmTypeID.put("PACKDECIMAL", "" + Types.TYPE_PACKDECIMAL);
		ccnvsnParmTypeID.put("OBJECT", "" + Types.TYPE_OBJECT);

		return ccnvsnParmTypeID;
	}

	/**
	 * 파라미터에 맵핑되는 Type의 String 이름 반환
	 */
	public static String getType(int type) {
		switch (type) {
		case Types.TYPE_UNKNOWN:
			return "UNKNOWN";

		case Types.TYPE_STRING:
			return "STRING";

		case Types.TYPE_INT:
			return "INT";

		case Types.TYPE_LONG:
			return "LONG";

		case Types.TYPE_SHORT:
			return "SHORT";

		case Types.TYPE_DOUBLE:
			return "DOUBLE";

		case Types.TYPE_FLOAT:
			return "FLOAT";

		case Types.TYPE_CHAR:
			return "CHAR";

		case Types.TYPE_BYTE:
			return "BYTE";

		case Types.TYPE_DATE:
			return "DATE";

		case Types.TYPE_TIME:
			return "TIME";

		case Types.TYPE_TIMESTAMP:
			return "TIMESTAMP";

		case Types.TYPE_NUMBER:
			return "NUMBER";

		case Types.TYPE_BYTEARRAY:
			return "BYTEARRAY";

		case Types.TYPE_NUMERIC:
			return "NUMERIC";

		case Types.TYPE_PACKDECIMAL:
			return "PACKDECIMAL";

		case Types.TYPE_OBJECT:
			return "OBJECT";

		case Types.TYPE_BOOLEAN:
			return "BOOLEAN";

		default:
			return "UNKNOWN";
		}
	}

	/**
	 * 파라미터에 맵핑되는 Function Type의 String 이름 반환하는 메서드
	 */
	public static String getFunctionType(int type) {
		switch (type) {
		case Function.TYPE_BUILTIN:
			return "BUILTIN";

		case Function.TYPE_PRIMITIVE:
			return "PRIMITIVE";

		case Function.TYPE_GENERIC:
			return "GENERIC";

		case Function.TYPE_CONVERT:
			return "CONVERT";

		case Function.TYPE_USERDEFINED:
			return "USERDEFINED";

		default:
			return "GENERIC";
		}
	}

	/**
	 * 레이아웃아이템노드유형ID를 위한 Hashtable 반환하는 메서드
	 */
	private static Map<String, String> loutItemNodePtrnID = new HashMap<>();

	public static Map<String, String> getLoutItemNodePtrnID() {

		loutItemNodePtrnID.put("NODE_MESSAGE", "" + Item.NODE_MESSAGE);
		loutItemNodePtrnID.put("NODE_GROUP", "" + Item.NODE_GROUP);
		loutItemNodePtrnID.put("NODE_FIELD", "" + Item.NODE_FIELD);
		loutItemNodePtrnID.put("NODE_ATTR", "" + Item.NODE_ATTR);

		return loutItemNodePtrnID;
	}

	/**
	 * 파라미터에 맵핑되는 LoutItemNode유형 Type의 String 이름 반환하는 메서드
	 */
	public static String getLoutItemNodePtrnID(int type) {
		switch (type) {
		case Item.NODE_MESSAGE:
			return "NODE_MESSAGE";

		case Item.NODE_GROUP:
			return "NODE_GROUP";

		case Item.NODE_FIELD:
			return "NODE_FIELD";

		case Item.NODE_ATTR:
			return "NODE_ATTR";

		default:
			return "UNKNOWN_NODE_TYPE";
		}
	}

}
