/******************************************************************************
 *                                                                            *
 *                    Copyright 2016 Subterranean Security                    *
 *                                                                            *
 *  Licensed under the Apache License, Version 2.0 (the "License");           *
 *  you may not use this file except in compliance with the License.          *
 *  You may obtain a copy of the License at                                   *
 *                                                                            *
 *      http://www.apache.org/licenses/LICENSE-2.0                            *
 *                                                                            *
 *  Unless required by applicable law or agreed to in writing, software       *
 *  distributed under the License is distributed on an "AS IS" BASIS,         *
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  *
 *  See the License for the specific language governing permissions and       *
 *  limitations under the License.                                            *
 *                                                                            *
 *****************************************************************************/
package com.subterranean_security.crimson.core.util;

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

import com.subterranean_security.crimson.universal.Universal;

public final class DateUtil {
	private DateUtil() {
	}

	private static final long SECONDS_IN_MINUTE = 60;
	private static final long SECONDS_IN_HOUR = SECONDS_IN_MINUTE * 60;
	private static final long SECONDS_IN_DAY = SECONDS_IN_HOUR * 24;
	private static final long SECONDS_IN_WEEK = SECONDS_IN_DAY * 7;
	private static final long SECONDS_IN_YEAR = SECONDS_IN_WEEK * 52;

	public static boolean isSameDay(Date d1, Date d2) {
		SimpleDateFormat formatter = new SimpleDateFormat("MMddyyyy");
		return formatter.format(d1).equals(formatter.format(d2));
	}

	public static int uptime() {
		Date now = new Date();
		return (int) (now.getTime() - Universal.start.getTime()) / 1000;
	}

	/**
	 * Return the time between two dates (in any order) as a nicely formatted
	 * string
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static String timeBetween(Date d1, Date d2) {
		long seconds = Math.abs(d1.getTime() - d2.getTime()) / 1000;

		int years = (int) (seconds / SECONDS_IN_YEAR);
		seconds -= years * SECONDS_IN_YEAR;
		int weeks = (int) (seconds / SECONDS_IN_WEEK);
		seconds -= weeks * SECONDS_IN_WEEK;
		int days = (int) (seconds / SECONDS_IN_DAY);
		seconds -= days * SECONDS_IN_DAY;
		int hours = (int) (seconds / SECONDS_IN_HOUR);
		seconds -= hours * SECONDS_IN_HOUR;
		int minutes = (int) (seconds / SECONDS_IN_MINUTE);
		seconds -= minutes * SECONDS_IN_MINUTE;

		StringBuffer result = new StringBuffer();
		switch (years) {
		case 0:
			break;
		case 1:
			result.append(years);
			result.append(" year ");
			break;
		default:
			result.append(years);
			result.append(" years ");
			break;
		}
		switch (weeks) {
		case 0:
			break;
		case 1:
			result.append(weeks);
			result.append(" week ");
			break;
		default:
			result.append(weeks);
			result.append(" weeks ");
			break;
		}
		switch (days) {
		case 0:
			break;
		case 1:
			result.append(days);
			result.append(" day ");
			break;
		default:
			result.append(days);
			result.append(" days ");
			break;
		}
		switch (hours) {
		case 0:
			break;
		case 1:
			result.append(hours);
			result.append(" hour ");
			break;
		default:
			result.append(hours);
			result.append(" hours ");
			break;
		}
		switch (minutes) {
		case 0:
			break;
		case 1:
			result.append(minutes);
			result.append(" minute ");
			break;
		default:
			result.append(minutes);
			result.append(" minutes ");
			break;
		}
		return result.substring(0, result.length() - 1);
	}

}
