package com.eactive.eai.rms.common.util;

import java.math.BigDecimal;
import java.util.List;

import org.apache.log4j.Logger;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;

public class StringUtils
        extends org.apache.commons.lang.StringUtils {
    
	
	private static Logger logger = Logger.getLogger(StringUtils.class);
	
    public static final String SPACE = " ";
    public static final String ZERO = "0";

    public StringUtils() {
        super();
    }

    /**
     * Method cutting. 문자열 바이트수만큼 끊어주고, 생략표시하기
     * 한글일 경우 1바이트를 더해서 잘리지 않게 한다.
     * @param str 문자열
     * @param size 바이트수
     * @param trail 생략 문자열. 예) "..."
     * @return String
     */
    public static String cutting(String str, int size, String trail) {

        if (str == null || str.equals("")) {
            return "";
        } else {
            String oldString = str;
            int newLength = 0, length = 0;
            char c;
            try {
                if (new String(oldString.getBytes(), "8859_1").length() > size) {
                    while (length + 1 < size) {
                        c = oldString.charAt(newLength);
                        length++;
                        newLength++;
                        if (c > 127)
                            length++; //2-byte character..
                    }
                    oldString = oldString.substring(0, newLength) + trail;
                }
            } catch (java.io.UnsupportedEncodingException e) {
            	logger.error("error " + e);
            }
            return oldString;
        }
    }


    /**
     * 문자열을 바이트수만큼 잘라주고 ( 한글깨짐 방지 (-1))
     * 스트링배열로 전체 문자열을 리턴한다
     * @param str 대상 문자열
     * @param size 자를 바이트수 
     * @return
     */

    public static String[] cuttings(String str, int size) {
    	String[] reObj = null;
        if (str == null || str.equals("")) {
            return reObj;
        } else {
        	int orgBLen = str.getBytes().length;
        	int s = orgBLen % size == 0 ? orgBLen / size : orgBLen / size + 1;
        	reObj = new String[s];
            String oldString = str;
            char c;
            try {
            	for( int idx =0; idx < s ; idx ++ ) {
                    int newLength = 0, length = 0;
                    size = oldString.getBytes().length < size ? oldString.getBytes().length : size;
	                    while (length + 1 < size) {
	                        c = oldString.charAt(newLength); 
	                        length++;
	                        newLength++;
	                        if (c > 127)
	                            length++; //2-byte character..
	                    }
//                        c = oldString.charAt(newLength); 
//                        if( c <=  127 ) {
//                        	newLength++;
//                        }
	                    reObj[idx] = oldString.substring(0, newLength);
	                    oldString = oldString.substring(newLength, oldString.length());
            	}
            } catch (Exception e) {
            	logger.error(" error", e); 
            	//e.printStackTrace();
            }
            return reObj;
        }
    }
    
    
    /**
     * 문자열 값을 가져온다.
     * 값이 null일 경우 디폴트 값을 리턴한다.
     * @param obj 문자열 object
     * @param defaultValue 오류시 반환할 기본 문자열
     * @return String
     */
    public static String getStringValue(Object obj, String defaultValue)
    {
    	String rtnValue = null;
    	try
    	{
    		rtnValue = (String)obj;
    	}
    	catch (Exception e){
    		return defaultValue;
    	}

    	return rtnValue != null ? rtnValue : defaultValue;
    }
    
    public static String toXMLString(Document doc, boolean exp) throws Exception {
    	return toXMLString(doc, 0, exp);
    }
    
    public static String toXMLString(Document doc, int depth, boolean exp) throws Exception {
    	StringBuffer sb = new StringBuffer();  // 5, TRUE
    	String newLine = !exp ? "" : "\n";
    	
    	sb.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + newLine);
    	
    	// ROOT 이므로 FORMAT부터 시작
    	Element root = doc.getRootElement();
    	List<Element> list = root.getChildren();
		List<Attribute> atts = root.getAttributes();
    	
    	
    	sb.append(!exp || depth == 0 ? "" : StringUtils.rightPad(SPACE, depth)).append("<").append(root.getName());  // Element START TAG
		
    	// 속성 값 추가
		if( atts != null && atts.size() > 0 ) {
			for( Attribute att : atts ) {
				sb.append(SPACE).append(att.getName()).append("=\"").append(att.getValue()).append("\"");
			}
		}
		sb.append(">" + newLine);
		// 자식 Element StringBuffer에 담기
		if( list.size() > 0 ) {
	    	sb.append(toXMLString(list, ++depth, exp));
		}
		sb.append(!exp || --depth == 0 ? "" : StringUtils.rightPad(SPACE, depth)).append("</").append(root.getName()).append(">" + newLine);  // Element END Tag
    
//    	System.out.println("StringUtils.toXMLString(Document) =======================================");
//    	System.out.println(sb.toString());
//    	System.out.println("=========================================================================");
    	
    	return sb.toString();
    }
    
    public static String toXMLString( List<Element> list, int depth , boolean exp ) {
    	StringBuffer sb = new StringBuffer();
    	String newLine = !exp ? "" : "\n";
    	
    	for( Element el : list ) {
    		sb.append(!exp || depth == 0 ? "" : StringUtils.rightPad(SPACE, depth)).append("<").append(el.getName());  // Element START TAG
    		
    		List<Attribute> atts = el.getAttributes();
    		List<Element> e = el.getChildren();
    		//속성 값 추가
    		if( atts != null && atts.size() > 0 ) {
    			for( Attribute att : atts ) {
    				sb.append(SPACE).append(att.getName()).append("=\"").append(att.getValue()).append("\"");
    			}
    		}
    		
    		if( e == null || e.size() <= 0 ) {  // 자식 Element가 없는 경우
    			if( el.getText() != null && el.getText().length() > 0 ) {  // TEXT가 있으면 표시
    				sb.append(">");
    				sb.append(el.getText());
        			sb.append("</").append(el.getName()).append(">" + newLine);  // Element END Tag
    			} else {
    				sb.append("/>" + newLine);
    			}
    		} else {
    			sb.append(">" + newLine);    			
    			sb.append(toXMLString(e, ++depth, exp));
    			sb.append(!exp || --depth == 0 ? "" : StringUtils.rightPad(SPACE, depth)).append("</").append(el.getName()).append(">" + newLine);  // Element END Tag
    		}
    	}
    	return sb.toString();
    }
    
    public static String toString(Object val) {
		return val != null ? val.toString() : null;
	}

    public static Long toLong(Object val) {
		return val != null ? ((Number) val).longValue() : null;
	}

    public static BigDecimal toDecimal(Object val) {
		if (val == null) return null;
		if (val instanceof BigDecimal) return (BigDecimal) val;
		return new BigDecimal(val.toString());
	}
//    
//    /** 
//     * - "" 나 Null 을 입력받아 SPACE 로 변환한다.
//     * @param val
//     * @return
//     */
//    public static String addSpace(String val) {
//        if(val == null || val.equals("")) {
//            val = " ";
//        }
//        return val;
//    }
//    
//    /**
//     * - trim 시 Null 을 체크하여 에러가 발생하지 않도록 한다.
//     * @param val
//     * @return
//     */
//    public static String trimSpace(String val) {
//        if( val == null ) {
//            val = "";
//        } else {
//            val = val.trim();
//        }
//        return val;
//    }
//    
//    /**
//     * - trim 시 Null 을 체크하여 에러가 발생하지 않도록 한다.
//     * @param val
//     * @return
//     */
//    public static String zeroSpace(String val) {
//        if( val == null || val.equals("")) {
//            val = "0";
//        }
//        return val;
//    }
    
}
