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

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;

public class DateUtil {
    private DateUtil() {}

    private static Logger logger = Logger.getLogger(DateUtil.class);
    
    private static Date get() {
        return new Date();
    }

    /**
     * 일정기간 이전[+]/이후[-] Date object를 반환한다.
     * 
     * @param ai_day
     *            일수 차이
     * @return Date
     */
    private static Date get(int ai_day) {
        // 변수선언 및 초기화.
        Calendar cal = Calendar.getInstance();
        // 일정기간 이전/이후 계산.
        if (ai_day != 0)
            cal.add(Calendar.DATE, ai_day);
        return cal.getTime();
    }

    /**
     * 현재일시를 특정형식(yyyyMMddhhmmss)으로 반환
     * 
     * @param as_format
     * @return String
     */
    public static String getDateTime(String as_format) {
        // 변수선언 및 초기화.
        Date date = get();
        SimpleDateFormat dateFormat = new SimpleDateFormat(as_format);
        return dateFormat.format(date);
    }

    /**
     * 일정기간 이전[+]/이후[-] 일시를 특정형식(yyyyMMddhhmmss)으로 반환 한다.
     * 
     * @param as_format
     * @param ai_day
     * @return String
     */
    public static String getDateTime(String as_format, int ai_day) {
        // 변수선언 및 초기화.
        Date date = get(ai_day);
        SimpleDateFormat dateFormat = new SimpleDateFormat(as_format);
        return dateFormat.format(date);
    }

    /**
     * 현재일시를 yyyyMMddhhmmss 형식으로 반환한다.
     * 
     * @return String
     */
    public static String getDateTime() {
        return getDateTime("yyyyMMddHHmmss");
    }

    public static String getDateTimeMilliSecound() {
        return getDateTime("yyyyMMddHHmmssSS").substring(0, 16);
    }

    /**
     * 일정기간 이전[+]/이후[-] 일시(yyyyMMddhhmmss)를 반환 한다.
     * 
     * @param ai_day
     * @return String
     */
    public static String getDateTime(int ai_day) {
        return getDateTime("yyyyMMddHHmmss", ai_day);
    }

    /**
     * 분까지 현재일시(yyyyMMddHHmm)를 반환한다.
     * 
     * @return String
     */
    public static String getDateMin() {
        return getDateTime("yyyyMMddHHmm");
    }

    /**
     * 분까지 일정기간 이전[+]/이후[-] 일시(yyyyMMddhhmmss)를 반환한다.
     * 
     * @param ai_day
     * @return String
     */
    public static String getDateMin(int ai_day) {
        return getDateTime("yyyyMMddHHmm", ai_day);
    }

    /**
     * 시까지 현재일시(yyyyMMddHH)를 반환한다.
     * 
     * @return String
     */
    public static String getDateHour() {
        return getDateTime("yyyyMMddHH");
    }

    /**
     * 시까지 일정기간 이전[+]/이후[-] 일시(yyyyMMddHH)를 반환한다
     * 
     * @param ai_day
     * @return String
     */
    public static String getDateHour(int ai_day) {
        return getDateTime("yyyyMMddHH", ai_day);
    }

    /**
     * 현재일자(yyyyMMdd)를 반환한다
     * 
     * @return String
     */
    public static String getDate() {
        return getDateTime("yyyyMMdd");
    }

    /**
     * 일정기간 이전[+]/이후[-] 의 일자(yyyyMMdd)를 반환한다.
     * 
     * @param ai_day
     * @return String
     */
    public static String getDate(int ai_day) {
        return getDateTime("yyyyMMdd", ai_day);
    }

    /**
     * 현재년도를 반환한다.
     * 
     * @return String
     */
    public static String getYear() {
        return getDateTime("yyyy");
    }

    /**
     * 일정기간 이전[+]/이후[-]의 년도를 반환한다.
     * 
     * @param ai_day
     * @return String
     */
    public static String getYear(int ai_day) {
        return getDateTime("yyyy", ai_day);
    }

    /**
     * 현재 월을 반환한다.
     * 
     * @return String
     */
    public static String getMonth() {
        return getDateTime("MM");
    }

    /**
     * 일정기간 이전[+]/이후[-]의 월을 반환한다.
     * 
     * @param ai_day
     * @return String
     */
    public static String getMonth(int ai_day) {
        return getDateTime("MM", ai_day);
    }

    /**
     * 현재 일을 반환한다.
     * 
     * @return String
     */
    public static String getDay() {
        return getDateTime("dd");
    }

    /**
     * 일정기간 이전[+]/이후[-]의 일을 반환한다.
     * 
     * @param ai_day
     * @return String
     */
    public static String getDay(int ai_day) {
        return getDateTime("dd", ai_day);
    }

    /**
     * 현재 시간을 반환한다.(24시간 기준)
     * 
     * @return String
     */
    public static String getHour() {
        return getDateTime("HH");
    }

    /**
     * 현재 분을 반환한다.
     * 
     * @return String
     */
    public static String getMinute() {
        return getDateTime("mm");
    }

    /**
     * 현재 초를 반환한다.
     * 
     * @return String
     */
    public static String getSecond() {
        return getDateTime("ss");
    }

    public static Date getFormatDate(String as_format, String date) {
        Date returnDate = null;
        try {
            SimpleDateFormat formate = new SimpleDateFormat(as_format);
            returnDate = formate.parse(date);
        } catch (ParseException e) {
        	//취약점소스 수정 2020.08.24
        	logger.error(" error", e); 
        }
        return returnDate;
    }

    public static Date getFormatDate(String date) {
        return getFormatDate("yyyyMMdd", date);
    }

}
