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

import com.eactive.eai.adapter.wca.global.WCADefine;
import com.eactive.eai.common.server.EAIServerManager;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;

/**
 * 1. 기능 :
 * 2. 처리 개요 :
 * 		- 
 * 3. 주의사항
 * 		- 
 * 
 * @author : Administrator
 * @version : 2005. 6. 20.
 * @see :
 * @since : 2005. 6. 20. 오후 1:40:39
 */
public class MyUtil {

    public synchronized static String rightPadString(String inputStr, int nDataLen, String pasStr) {
		StringBuffer 	returnStrBuff = new StringBuffer();
//		int				nInputStrLen = inputStr.length();		
		
		returnStrBuff.append(inputStr);
		for(int i = 0; i < (nDataLen - inputStr.length()); i++)
		{
		    returnStrBuff.append(pasStr);
		}
		
		return returnStrBuff.toString();
	}
    
	public static String leftPadString(String src, int cnt, String padStr) {
	String tmpValue = "";

	src = src.trim();

	for (int i = 0; i < (cnt - src.length()); i++) {
	  tmpValue += padStr;

	}
	return tmpValue + src;
  }
	// dataLen에 해당하는 길이 필드 byte 어레이를 조립하여 리턴
	public synchronized static byte[] getLenBuff(int nDataLen, int nBuffLen)
	{
		StringBuffer lenBuff = new StringBuffer();
		String		tempDataLenStr = String.valueOf(nDataLen);		
		
		for(int i = 0; i < (nBuffLen - tempDataLenStr.length()); i++)
		{
		    lenBuff.append("0");
		}
		
		lenBuff.append(String.valueOf(nDataLen));			

		return lenBuff.toString().getBytes();
	}
    
    /**
	 * str에서 rep에 해당하는 String을 tok로 replace한다.
	 *
	 * @param str 문자열
	 * @param rep 찾는 문자열
	 * @param tok 변환할 문자열
	 * @return String 변환된 문자열
	 */
	public static String replaceString(String str, String rep, String tok) {
	  String retStr = "";

	  if (str == null || "".equals(str)) {
		return "";
	  }

	  for (int i = 0, j = 0; (j = str.indexOf(rep, i)) > -1; i = j + rep.length()) {
		retStr += (str.substring(i, j) + tok);
	  }
	  return (str.indexOf(rep) == -1) ? str :
		  retStr + str.substring(str.lastIndexOf(rep) + rep.length(), str.length());
	}
    
    
  /**
   *   년월일 변환(yyyy/MM/dd)
   *
   *   @param  s_chkValue     변환할 문자열
   *   @return  변환된 문자열
   */
  public static String formatDate(String s_chkValue) 
  {
	String s_rtnValue = "";
	String s_tmpValue = "";

	if (s_chkValue == null) {
	  return "";
	}

	s_tmpValue = s_chkValue.trim();

	if (s_tmpValue.equals("")) {
	  return "";
	}
	
	if (s_tmpValue.length() == 8 || s_tmpValue.length() == 12 ||
		s_tmpValue.length() == 14) {
	  s_rtnValue = s_tmpValue.substring(0, 4) + "/" + s_tmpValue.substring(4, 6) +
		  "/"
		  + s_tmpValue.substring(6, 8);	
	  return s_rtnValue.trim();
	}

	return s_tmpValue;
  }

  /**
   *   년월일 변환(yyyy.MM.dd)
   *
   *   @param  s_chkValue     변환할 문자열
   *   @return  변환된 문자열
   */
    public String formatDateD(String s_chkValue) 
      {
        String s_rtnValue = "";
        String s_tmpValue = "";
    
        if (s_chkValue == null) {
          return "";
        }
    
        s_tmpValue = s_chkValue.trim();
    
        if (s_tmpValue.equals("")) {
          return "";
        }
    
        if (s_tmpValue.length() == 8 || s_tmpValue.length() == 12 ||
            s_tmpValue.length() == 14) {
          s_rtnValue = s_tmpValue.substring(0, 4) + "." + s_tmpValue.substring(4, 6) +
              "."
              + s_tmpValue.substring(6, 8);
          return s_rtnValue.trim();
        }
    
        return s_tmpValue;
    }
  
    public static String formatTime(String s_chkValue) 
    {
        String s_rtnValue = "";
        String s_tmpValue = "";
    
        if (s_chkValue == null) {
            return "";
        }
    
        s_tmpValue = s_chkValue.trim();
    
        if (s_tmpValue.equals("")) {
            return "";
        }	
    
        if (s_tmpValue.length() == 6) {
            s_rtnValue = s_tmpValue.substring(0, 2) + ":" + s_tmpValue.substring(2, 4) +
            ":" + s_tmpValue.substring(4, 6);	
        return s_rtnValue.trim();
      }
    
      return s_tmpValue;
    }
    
    public static String formatMilliTime(String s_chkValue) 
    {
        String s_rtnValue = "";
        String s_tmpValue = "";
    
        if (s_chkValue == null) {
            return "";
        }
    
        s_tmpValue = s_chkValue.trim();
    
        if (s_tmpValue.equals("")) {
            return "";
        }	
    
        if (s_tmpValue.length() == 8) {
            s_rtnValue = s_tmpValue.substring(0, 2) + ":" + s_tmpValue.substring(2, 4) +
            ":" + s_tmpValue.substring(4, 6) + "." + s_tmpValue.substring(6, 8);	
        return s_rtnValue.trim();
      }
    
      return s_tmpValue;
    }

    // 바이트값을 헥사 스트링으로 변환할때 자리수를 맞추기 위해 "0"을 패딩
	public static String pad0(String str, int size)
	{   
		char[] zeros = new char[size - str.length()];
    	
		for(int i = 0; i < zeros.length; i++ )
		{
			zeros[i] = '0';
		}
        
		return new String(zeros) + str;
	}
	
	// 바이트값을 헥사 스트링으로 변환
	public static String toHex(byte[] codes)
	{
		if(codes.length == 0)
			return "";
    		
		String hex = pad0(Integer.toHexString(codes[0] & 0xff), 2);
        
		for( int i = 1; i < codes.length; i++ )
			hex += " " + pad0( Integer.toHexString(codes[i] & 0xff), 2);
		return hex;
	}
	
	// 바이트값을 헥사 스트링으로 변환
	public static String toHex3(byte codes)
	{
		String hex = pad0(Integer.toHexString(codes & 0xff), 2);
		return hex;
	}    
    
    // 바이트 어레이를 복사
	public static void memcpy(byte[] dst, byte[] src, int a, int b, int len)
	{
		for(int i = 0; i < len; i++)
		{
			dst[i + a] = src[i + b];
		}
	}
    
   /** 
    * 1. 기능 :  호스트 이름이 같은지 판단
    * 2. 처리 개요 : 
    * 3. 주의사항 
    *
    * @param sHostName 호스트 이름
    * @return 로컬 호스트 여부 (true/false)
    **/
    public static boolean isLocalHostName(String sHostName)
    {
        try{
            String sLocalHostName = EAIServerManager.getInstance().getLocalServerHostName();
            if (sHostName.equals(sLocalHostName))   
                return true;
            else 
                return false;
        }catch (Exception e){
//        	System.out.println("isLocalHostName error - " + sHostName);
            return false;
        }
    }
    
    public static String printBytes(char cFlag, int nDataLen, byte[] bDataBuff)
	{
		int		i, j;
		int		end_flag;		// 출력할 라인 수 
		int		rem_flag;		// 맨 마지막줄의 출력할 데이터 길이
		int		nRemainDataLen = 0;
		byte[]	tempData = null;
		int		tempLen = 0;
		
        StringBuffer sb_print = new StringBuffer();
			
		tempData = new byte[16];
		
		try {
			
			
			sb_print.append("\r\n====================================================================\r\n");

			// Format the current time.
			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd=hh:mm:ss");
			String dateString = formatter.format(ZonedDateTime.now());

			
			sb_print.append(dateString + " : " + "Data Length = " + nDataLen + "\r\n");
		
			// 출력할 라인 수 계산
			end_flag = nDataLen / 16;
			if((nDataLen % 16) != 0)
			{
				end_flag++;
			}
		
			// 맨 마지막줄의 출력할 데이터 길이 계산
			rem_flag = nDataLen - (16 * (end_flag - 1));

			nRemainDataLen = nDataLen;
		    
			// 매 라인마다 인쇄루틴 For 루프
			for(i = 0; i < end_flag; i++) 
			{
				int nTempLen = i * 16;
				
				// 데이터 수를 문자열로 변환
				String  strLength = Integer.toString(nTempLen);
				int		strLen = strLength.length();
				
				strLen = 6 - strLen;
				
				for(int x = 0; x < strLen; x++)
					sb_print.append("0");
					
				sb_print.append(strLength);	
				
				// 넘겨받은 데이터에서 16바이씩 잘라서 복사
				// Bug!!!
				if(nRemainDataLen > 16)
				{
					memcpy(tempData, bDataBuff, 0, i * 16, 16);
					tempLen = 16;
					nRemainDataLen -= 16;
				}
				else
				{
					memcpy(tempData, bDataBuff, 0, i * 16, nRemainDataLen);
					tempLen = nRemainDataLen;
				}
		
				for(j = 0; j < 16; j++)
				{
					if((j % 4) == 0)
					{
						sb_print.append("  ");
					}
					
					// 인쇄할 라인이 마지막 라인이 아니거나 
					// 인쇄할 데이터 위치가 마지막 바이트가 아닐 경우
					if((i != (end_flag - 1)) || (j < rem_flag)) 
					{
						sb_print.append(toHex3(tempData[j]));
					}
					else
					{
						sb_print.append("  ");
					}
				}					
				
				sb_print.append("    |");
		        
				// 라인별로 데이터에 해당하는 문자열 인쇄 
				for(j = 0; j < 16; j++) 
				{
					// 인쇄할 라인이 마지막 라인이 아니거나 
					// 인쇄할 데이터 위치가 마지막 바이트가 아닐 경우
					if((i != end_flag - 1) || (j < rem_flag)) 
					{
						// cFlag값은 'a'값(ASCII)일 경우, ASCII 문자로 인쇄
						if(cFlag == WCADefine.ASCII_CODE) 
						{
							// 데이터가 인쇄할 수 있는 범위안에 있으면, 
							// Character형으로 인쇄하고, 아니면 "." 문자로 대체하여 인쇄
							if((tempData[j] > 0x1f) && (tempData[j] < 0x7e))
							{
								sb_print.append(tempData[j]);
							}
							else
							{
								sb_print.append(".");
							}
						} 
						// cFlag값은 'e'값(EBCDIC)일 경우, EBCDIC 문자를 변환하여 인쇄
						else if(cFlag == WCADefine.EBCDIC_CODE) 
						{
							byte xx = CodeCvrt.cvrtEbc2Ksc2(tempData[j]);
							if((xx <= 0x1f) || (xx >= 0x7e))
								sb_print.append(".");
							else
								sb_print.append(xx);
						}
					}
					// 인쇄할 마지막 라인의 마지막 데이터를 넘겼을 경우,공백으로 인쇄
					else  
					{
						sb_print.append(" ");
					}
				}
		        
				// 구분선 인쇄
				sb_print.append("|\r\n");
			}
			
			sb_print.append("====================================================================\r\n\r\n");
			
			return sb_print.toString();
		}
		catch(Exception e)
		{
            return "";
		}
	}
    
    // 20090810 Start
	/**
	 *  s_data를 s_delim 으로 파싱하여 ArrayList에 저장 
	 */
	public static ArrayList stringTokenizer(String s_data, String s_delim) 
	{
		int  	 i_pos  = 0;
		int		 i_strt = 0;
		ArrayList al_token = new ArrayList();
		String s_temp_str = null;
		
		if(s_data.equals("")) 
			return null;
		
		for(i_strt = 0; i_strt < s_data.length(); ) 
		{	
			if ( (i_pos += s_data.substring(i_strt).indexOf(s_delim)) > 0 )	//s_delim 위치 값 구하기  
			{	
				if (i_strt > i_pos)	 break;// overflow
				
				
				s_temp_str = s_data.substring(i_strt, i_pos);
				if (s_temp_str == null) s_temp_str = "";
					
				al_token.add(s_temp_str);
				
				i_pos   +=  s_delim.length();	
				i_strt  = i_pos ;				
			}	
			else
				break;
		}
		
		// 구분자가 끝에 없을 경우
		s_temp_str = s_data.substring(i_strt);
		if(s_temp_str != null && !s_temp_str.equals(""))
			al_token.add(s_temp_str);
		
		return al_token;
	}  
	// 20090810 End
}
