package org.smartpaws.util;
import org.smartpaws.R;
import org.smartpaws.objects.Event;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import static org.smartpaws.MainActivity.INSTANCE;
public final class TimeUtils {
private static final int SECOND = 1;
private static final int MINUTE = 60 * SECOND;
private static final int HOUR = 60 * MINUTE;
private static final int DAY = 24 * HOUR;
private static final int MONTH = 30 * DAY;
private static final SimpleDateFormat startFormat = new SimpleDateFormat("EEE HH:mm", Locale.getDefault());
private static final SimpleDateFormat endFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());
static {
startFormat.setTimeZone(TimeZone.getDefault());
endFormat.setTimeZone(TimeZone.getDefault());
}
public static String getDayOfMonthSuffix(final int n) {
if (n < 1 || n > 31) return "";
if (n >= 11 && n <= 13) {
return "th";
}
switch (n % 10) {
case 1: return "st";
case 2: return "nd";
case 3: return "rd";
default: return "th";
}
}
public static String toFuzzyTime(Date date) {
TimeSpan ts = new TimeSpan(System.currentTimeMillis() - date.getTime());
double delta = Math.abs(ts.getSeconds());
if (delta < 0)
{
return "Ergh, I don't know when.";
}
if (delta < 1 * MINUTE)
{
return ts.getSeconds() == 1 ? "a second ago" : ts.getSeconds() + " seconds ago";
}
if (delta < 2 * MINUTE)
{
return "a minute ago";
}
if (delta < 45 * MINUTE)
{
return ts.getMinutes() + " minutes ago";
}
if (delta < 90 * MINUTE)
{
return "an hour ago";
}
if (delta < 24 * HOUR)
{
return ts.getHours() + " hours ago";
}
if (delta < 48 * HOUR)
{
return "yesterday";
}
if (delta < 30 * DAY)
{
return ts.getDays() + " days ago";
}
if (delta < 12 * MONTH)
{
int months = (int) Math.floor((double)ts.getDays() / 30);
return months <= 1 ? "a month ago" : months + " months ago";
}
else
{
int years = (int) Math.floor((double)ts.getDays() / 365);
return years <= 1 ? "one year ago" : years + " years ago";
}
}
public static Date getEndDate(Event event) {
Calendar cal = Calendar.getInstance();
cal.setTime(event.getDateStart());
cal.add(Calendar.MINUTE, event.getDuration());
return cal.getTime();
}
public static boolean hasStarted(Event event) {
return event.getDateStart().compareTo(new Date(System.currentTimeMillis())) < 0;
}
public static boolean isPast(Event event) {
return getEndDate(event).compareTo(new Date(System.currentTimeMillis())) < 0;
}
public static boolean isRunning(Event event) {
return hasStarted(event) && !isPast(event);
}
private static class TimeSpan {
private final long span;
public TimeSpan(long spanMillis) {
this.span = spanMillis;
}
public long getSeconds() {
return Math.round(span / 1000);
}
public long getMinutes() {
return Math.round((span / 1000) / 60);
}
public int getHours() {
return Math.round(((span / 1000) / 60) / 60);
}
public int getDays() {
return Math.round((((span / 1000) / 60) / 60) / 24);
}
}
public static String formatEventTime(Date date, int duration) {
StringBuilder result = new StringBuilder(startFormat.format(date));
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MINUTE, duration);
result.append(" - ");
result.append(endFormat.format(cal.getTime()));
return result.toString();
}
public static String getTimeTill(String eventName, Date date) {
int secondsTill = Math.round((date.getTime() - System.currentTimeMillis()) / 1000);
if (secondsTill < 0) return "the distant past";
if (secondsTill < 60) {
if (secondsTill == 1) {
return INSTANCE.getString(R.string.notif_event_start_sec, eventName);
}
return INSTANCE.getString(R.string.notif_event_start_secs, eventName, secondsTill);
}
if (secondsTill >= 60) {
int minsTill = Math.round(secondsTill / 60);
if (minsTill == 1) return INSTANCE.getString(R.string.notif_event_start_min, eventName);
if (minsTill >= 60) {
long hoursTill = Math.round(minsTill / 60);
if (hoursTill == 1) return INSTANCE.getString(R.string.notif_event_start_hour, eventName);
return INSTANCE.getString(R.string.notif_event_start_hours, eventName, hoursTill);
}
return INSTANCE.getString(R.string.notif_event_start_mins, eventName, minsTill);
}
return INSTANCE.getString(R.string.notif_event_start_soon, eventName);
}
}