package com.dbs.mplus.fatima.framework.util;

import org.json.JSONObject;

import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * 문자열 처리 
 * @author hyeeun 
 */
public class MPlusStringUtil {
	private static final SimpleDateFormat iso8601Format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
	private static final SimpleDateFormat yyyyMMddFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
	private static final SimpleDateFormat yyyyMMddHHmmssFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());

	public static String convertDateString(Date date, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault());
		return dateFormat.format(date);
	}

	public static String convertDateString(String date, String source, String target) {
		String result = null;
		SimpleDateFormat srcFormat = new SimpleDateFormat(source, Locale.getDefault());
		SimpleDateFormat targetFormat = new SimpleDateFormat(target, Locale.getDefault());
		try {
			Date srcDate = srcFormat.parse(date);
			result = targetFormat.format(srcDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 날짜를 형식에 맞게 변환 
	 * @param dt
	 * @return
	 */
	public static String convertDateTimeString(Date dt) { 
		return iso8601Format.format(dt); 
	}
	
	/**
	 * yyyy-MM-dd HH:mm:ss을 Date형식으로 변환 
	 * @param str
	 * @return
	 */
	public static Date convertStringtoDate(String str) { 
		try { 
			return iso8601Format.parse(str); 
		}
		catch(final ParseException ex) { 
			MPlusLogUtil.ERROR(MPlusStringUtil.class, "fail to convert : convertStringtoDate(" + str + ")");
		}
		
		return null; 
	}
	/**
	 * yyyy-MM-dd로 변환 
	 * @param date
	 * @return
	 */
	public static String convertYYYYMMDD(Date date) { 
		return yyyyMMddFormat.format(date); 	
	}


	/**
	 * 결제에서 사용되는 형식임
	 * @param date
	 * @return
	 */
	public static String convertYYYYMMDDHHMMSS(Date date) {
		return yyyyMMddHHmmssFormat.format(date);
	}


	/**
	 * timestamp로 반환 
	 * 
	 * @param dt
	 * @return
	 */
	public static long convertTimeStamp(String dt) { 
		try { 
			Date d = null; 
			
			try { 
				d = iso8601Format.parse(dt);  
			}
			catch(final Exception ex) { 
				d = yyyyMMddFormat.parse(dt); 
			}
			
			return d.getTime();
		}
		catch(final ParseException ex) { 
			MPlusLogUtil.ERROR(MPlusStringUtil.class, "fail to convert : convertTimeStamp(" + dt + ")", ex);
		}
		
		return Long.MIN_VALUE; 
	}
	
    /**
     * 문자열이 비어있는지 여부 확인
     * @param value 검사할 문자열
     * @return true : 비어있음, false : 값이 있음
     */
    public static boolean isEmpty(String value) {
        if(value == null) {
            return true;
        }

        value = value.trim();
		return "".equals(value);

	}

	public static String getNull2EmptyString(String value) {
		if(value == null || "null".equals(value)) {
			return "";
		}
		return value;
	}
    
    /**
     * 콜백 스크립트 문자열 만들기 
     * @param callBackName
     * @param args
     * @return
     */
    public static String getCallbackFnString(String callBackName, Object... args) { 
    	final StringBuilder builder = new StringBuilder("javascript:"); 
    	
    	builder.append(callBackName).append("("); 
    	if(args != null) { 
    		for(int i = 0; i < args.length; i++) {
    			if(args[i] instanceof String) { 
    				builder.append("'").append(args[i]).append("'"); 
    			}
    			else if(args[i] instanceof JSONObject) { // select문인경우  
    				builder.append(args[i]); 
    			}
    			else {
    				builder.append(args[i]); 
    			}
    			
    			if(i < args.length - 1) {
    				builder.append(", "); 
    			}
    		}
    	}
    	
    	builder.append(")"); 
    	
    	
    	return builder.toString(); 
    }
    
    /**
     * 파라미터명을 컬럼명으로 바꾸기 
     * @param enumClazz
     * @param paramName
     * @return
     */
    public static String convertParamNameToColumnName(Class<?> enumClazz, String paramName) throws Exception { 
    	if(!enumClazz.isEnum()) {
    		return null; 
    	}
    	
    	Method method = null;
    	
    	for(final Object o : enumClazz.getEnumConstants()) {
    		method = enumClazz.getMethod("getParamName", String.class); 
    		if(method != null) { 
    			// 실제 enum을 찾았고 
    			final Object e = method.invoke(o, paramName); 
    			method = enumClazz.getMethod("getColumnName"); 
    			
    			String columnName = null;
    			
    			// 파라미터 명이 컬럼명으로 등록되지 않은 경우임 
    			try {
    				columnName = (String) method.invoke(e); 
    			}
    			catch(final Exception ex) { 
    				MPlusLogUtil.DEBUG(MPlusStringUtil.class, paramName + "은 컬럼명이 아님");
    				return null; 
    			}
    			
    			//LogUtil.DEBUG(StringUtil.class, paramName + " --> " + columnName);
    			
    			return columnName; 
    		}
    	}
    	
    	return null; 
    }	
    /**
     * 컬럼명을 파라미터명으로 
     * @param enumClazz
     * @param columnName
     * @return
     * @throws Exception
     */
    public static String convertColumnNameToParamName(Class<?> enumClazz, String columnName) throws Exception {
    	if(!enumClazz.isEnum()) {
    		return null; 
    	}
    	
    	Method method = null;
    	
    	for(final Object o : enumClazz.getEnumConstants()) {
    		method = enumClazz.getMethod("getColumnName", String.class); 
    		if(method != null) { 
    			// 실제 enum을 찾았고 
    			final Object e = method.invoke(o, columnName); 
    			method = enumClazz.getMethod("getParamName"); 
    			return (String) method.invoke(e);
    		}
    	}
    	
    	return null;     	
    }
    
    /**
     * 오늘인지 
     * @param iso8601
     * @return
     */
    public static boolean isToday(String iso8601) {
    	// push 수신된거 저장은 날짜를 iso8601로 저장함 
    	// 왜냐면 가장 나중 메시지만 저장하기 위함 
    	if(MPlusStringUtil.isEmpty(iso8601)) {
    		return false; 
    	}
    	
    	// 앞에 년/월/일만 자르기 
    	iso8601 = iso8601.substring(0, 10); 
    	// 오늘 
    	String today = MPlusStringUtil.convertYYYYMMDD(new Date());

		return iso8601.equals(today);

	}

	/**
	 * 문자열을 숫자형으로 변환
	 * @param value
	 * @return
     */
	public static int convertStringToInteger(String value) {
		int result = 0;
		if(value != null) {
			try {
				result = Integer.parseInt(value);
			} catch (Exception e) {
				// 숫자가 아님
				e.printStackTrace();
			}
		}
		return result;
	}
}
