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

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

public class DateUtil {
	
	/**
	 * 날짜 형식을 받아서 오늘 날짜를 해당 형식으로 반환
	 *
	 * @param format
	 * @return
	 */
	public static String getCurrentDate(String format) {
		Date date = Calendar.getInstance().getTime();
		DateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(date);
	}

    /**
     * 현재날짜의 분을 첫째자리 반올림하여 리턴
     * @return
     */
    public static String getCurrentRoundMin() {
        int min = LocalDateTime.now().getMinute();
        min = (int) (Math.round((double)min/10)*10);
        return StringUtils.leftPad(String.valueOf(min), 2, '0');
    }

	/**
	 * 현재 시스템 날짜를 "yyyy-MM-dd" 형식으로 String 형으로 반환
	 *
	 * @return String
	 */
	public static String getCurrentDate() {
		return getCustomDay("", 0);
	}

	/**
	 * 현재 시스템 시간을 "HHmmss" 형식으로 String 형으로 반환
	 *
	 * @return String
	 */
	public static String getCurrentTime() {
		Timestamp wdate = null;
		String sDate = null;
		String temp = null;
		StringBuffer stringBuffer = new StringBuffer();
		long currentTimeMillis = System.currentTimeMillis();

		wdate = new Timestamp(currentTimeMillis);
		sDate = wdate.toString();

		stringBuffer.append(sDate.substring(11, 13));
		stringBuffer.append(sDate.substring(14, 16));
		stringBuffer.append(sDate.substring(17, 19));

		temp = stringBuffer.toString();

		return temp;
	}

	/**
	 * 현재 시스템 날짜 시간을 "yyyy-MM-dd HH24:mm:ss" 형식으로 반환
	 *
	 * @return String
	 */
	public static String getCurrentDateTime() {
		Timestamp timestamp = null;
		String timestampString = null;
		long currentTimeMillis = 0;

		currentTimeMillis = System.currentTimeMillis();

		timestamp = new Timestamp(currentTimeMillis);

		timestampString = timestamp.toString();
		timestampString = timestampString.substring(0, 19);

		return timestampString;
	}

	/**
	 * 현재 일자 기준으로 이전 일자를 찾아 리턴한다.
	 *
	 * @param int
	 * @return String
	 */
	public static String getCustomDay(String mode, int addDay) {
		Calendar dt = Calendar.getInstance();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

		if (addDay == 0) {
			return df.format(dt.getTime());
		} else {
			if (mode.equals("MONTH")) {
				dt.add(Calendar.MONTH, addDay);

				return df.format(dt.getTime());
			} else if (mode.equals("YEAR")) {
				dt.add(Calendar.YEAR, addDay);

				return df.format(dt.getTime());
			} else {
				dt.add(Calendar.DATE, addDay);

				return df.format(dt.getTime());
			}
		}
	}

	/**
	 * 특일 일자 기준으로 말일을 확인
	 *
	 * @param String
	 * @return String
	 **/
	public static String getCustomLastDay(String CallDay) {
		int Year = Integer.valueOf(CallDay.substring(0, 4));
		int Month = Integer.valueOf(CallDay.substring(5, 7)) - 1;

		Calendar calendar = Calendar.getInstance();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

		calendar.set(Year, Month, 1);

		int DayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

		calendar.set(Year, Month, DayOfMonth);

		return df.format(calendar.getTime());
	}

    /**
     * 현재일 기준으로 특정일까지 일수 차이를 리턴
     * @param targetDate
     * @return
     * @throws Exception
     */
    public static long diffDays(Date targetDate) throws Exception {
        Calendar getToday = Calendar.getInstance();
        getToday.setTime(new Date());

        Calendar cmpDate = Calendar.getInstance();
        cmpDate.setTime(targetDate);

        long diffSec = (cmpDate.getTimeInMillis() - getToday.getTimeInMillis()) / 1000;
        long diffDays = diffSec / (24*60*60);

        return diffDays;
    }
	
}
