package cokr.xit.ens.core.utils;

import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Checks {
    /**
     * val이 null이 아니면 그대로 리턴, 아니면 defVal
     *
     * @param val    T
     * @param defVal T
     * @return T
     */
    public static <T> T checkVal(T val, T defVal) {
        return (isNotNull(val) ? val : defVal);
    }

    /**
     * val이 Empty가 아니면 그대로 리턴, 아니면 defVal (Empty는 배열이나 Map도 가능)
     *
     * @param val    T
     * @param defVal T
     * @return T
     */
    public static <T> T checkEmptyVal(T val, T defVal) {
        return (isNotEmpty(val) ? val : defVal);
    }

    /**
     * expression이 true이면 val, 아니면 defVal
     *
     * @param expression boolean
     * @param tVal       T
     * @param fVal       T
     * @return T
     */
    public static <T> T checkVal(boolean expression, T tVal, T fVal) {
        return (expression ? tVal : fVal);
    }


    public static boolean isNull(Object checkValue) {
        return !isNotNull(checkValue);
    }

    public static boolean isNotNull(Object checkValue) {
        return checkValue != null;
    }

    public static boolean isEmpty(Object checkValue) {
        return !isNotEmpty(checkValue);
    }

    public static boolean isNotEmpty(Object checkValue) {
        if (isNotNull(checkValue)) {

            if (checkValue instanceof String) {
                return !((String) checkValue).isEmpty();
            } else if (checkValue instanceof Iterator<?>) {
                return ((Iterator<?>) checkValue).hasNext();
            } else if (checkValue instanceof Iterable<?>) {
                return ((Iterable<?>) checkValue).iterator().hasNext();
            } else if (checkValue instanceof Map<?, ?>) {
                return !((Map<?, ?>) checkValue).isEmpty();
            }
//			else if ( checkValue instanceof DataSetMap ) {
//				return !( ( DataSetMap ) checkValue ).isEmpty();
//			}

            if (checkValue.getClass().isArray()) {
                return ((Object[]) checkValue).length != 0;
            } else {
               
                return true;
            }
        }

        return false;
    }

    public static boolean isNumeric(String str) {
        if (Checks.isEmpty(str))
            return false;

        return str.matches("-?\\d+(.\\d+)?");
    }

    public static boolean isInstance(Object checkValue, Class<?>... classes) {
        if (isNotNull(checkValue)) {
            for (Class<?> clazz : classes) {
                if (clazz.isInstance(checkValue)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * email형식 체크
     *
     * @param str
     * @return
     * @메소드 : isCheckEmail
     */
    public static boolean isCheckEmail(String str) {
        if (Checks.isEmpty(str))
            return false;

        String regex = "^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

        Matcher matcher = pattern.matcher(str);
        return matcher.find();
    }

    /**
     * 전화형식 체크
     *
     * @param str
     * @return
     * @메소드 : isCheckTel
     */
    public static boolean isCheckTel(String str) {
        if (Checks.isEmpty(str))
            return false;

        String regex = "^\\d[\\d-]+\\d$";
        Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);

        Matcher matcher = pattern.matcher(str);
        return matcher.find();
    }

    /**
     * 주민번호 체크
     *
     * @param jid
     * @return
     */
    public static boolean isCheckJid(String jid) {
        if (jid == null) return false;

        String regex = "\\d{2}([0]\\d|[1][0-2])([0][1-9]|[1-2]\\d|[3][0-1])[1-8]\\d{6}";

        return Pattern.matches(regex, jid);
    }
}
