package kr.co.uplus.ez.common.utils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.lang3.StringUtils;

import com.google.gson.JsonObject;

public class TextUtils {

	public static final List<String> RCS_PRODUCTS = Arrays.asList("sms", "lms", "mms", "tmplt");
	public static final List<String> FALLBACK_PRODUCTS = Arrays.asList("fbsms", "fblms");
	public static final String GW_SUCCESS_CODE = "10000";
	/**
	 * 임의의 숫자 반환
	 * @param min 최소 숫자 (inclusive)
	 * @param max 최대 숫자 (inclusive)
	 */
	public static int randNum(int min, int max) {
		Random r = new Random();
		return r.nextInt((max - min) + 1) + min;
	}
	
	/**
	 * digit=1이면 ["1" ... "9"] 반환, digit=2면 ["10" ... "99"] 반환
	 * @param digit 자리 수
	 * @return 해당 자리 수의 임의의 숫자로된 문자열
	 */
	public static String randNumStr(int digit) {
		int min = (int) Math.pow(10, digit-1);
		int max = (int) Math.pow(10, digit) - 1;
		return String.valueOf(randNum(min, max));
	}
	
	public static String[] str2array(String str, String delimiters) {
		return org.springframework.util.StringUtils.tokenizeToStringArray(str, delimiters);
	}
	
	public static String array2str(String[] strs, String delimiter) {
		return org.springframework.util.StringUtils.arrayToDelimitedString(strs, delimiter);
	}

	/**
	 * 대상 템플릿 문자열에서 ${key} 부분을 찾아서 설정한 값으로 치환한다.
	 * 예) "Hello ${myKey1}" 문자열에 vars.put("myKey1", "foot") 적용하면 "Hello foo" 반환.
	 * @param tpl 대상 템플릿 문자열 
	 * @param vars 치환할 문자열 설정 객체
	 * @return 치환된 문자열
	 */
	public static String template(String tpl, Map<String, String> vars) {
	    for (Map.Entry<String, String> entry : vars.entrySet()) {
	        tpl = tpl.replace("${" + entry.getKey() + "}", entry.getValue());
	    }
	    return tpl;
	}
	
	public static boolean isNotNullJsonVal(JsonObject obj, String key) {
		return obj.has(key) && !obj.get(key).isJsonNull();
	}
	
	public static boolean isNullJsonVal(JsonObject obj, String key) {
		return !isNotNullJsonVal(obj, key);
	}
	
	public static boolean isGwSuccess(String code) {
		if (StringUtils.isEmpty(code)) return false;
		return GW_SUCCESS_CODE.equals(code);
	}
	
	public static boolean isGwFail(String code) {
		return !isGwSuccess(code);
	}
	
	public static boolean isRcsSuccess(String prod, String code) {
		return isRcsProd(prod) && isGwSuccess(code);
	}
	
	public static boolean isRcsFail(String prod, String code) {
		return isRcsProd(prod) && isGwFail(code);
	}
	
	public static boolean isFallbackSuccess(String prod, String code) {
		return isFallbackProd(prod) && isGwSuccess(code);
	}
	
	public static boolean isFallbackFail(String prod, String code) {
		return isFallbackProd(prod) && isGwFail(code);
	}
	
	public static boolean isRcsProd (String prod) {
		return StringUtils.isEmpty(prod) || RCS_PRODUCTS.contains(prod);
	}
	
	public static boolean isFallbackProd (String prod) {
		if (StringUtils.isEmpty(prod)) return false;
		return FALLBACK_PRODUCTS.contains(prod);
	}

}
