package com.etiennelawlor.loop.utilities;
import android.text.format.DateUtils;
import com.etiennelawlor.loop.LoopApplication;
import com.etiennelawlor.loop.R;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
/**
* Created by etiennelawlor on 11/8/15.
*/
public class DateUtility {
// region Constants
public static final int FORMAT_RELATIVE = 0;
public static final int FORMAT_ABSOLUTE = 1;
// endregion
public static Calendar getCalendar(String timestamp, String pattern){
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getDefault());
try {
Date date = sdf.parse(timestamp);
calendar.setTime(date);
} catch (ParseException e){
e.printStackTrace();
}
return calendar;
}
public static boolean isSameYear(Calendar cal1, Calendar cal2){
int year1 = cal1.get(Calendar.YEAR);
int year2 = cal2.get(Calendar.YEAR);
return (year1 == year2);
}
public static boolean isToday(Calendar calendar){
return DateUtils.isToday(calendar.getTimeInMillis());
}
public static boolean isTomorrow(Calendar calendar){
Calendar cal = (Calendar) calendar.clone();
cal.add(Calendar.DAY_OF_YEAR, -1);
return DateUtils.isToday(cal.getTimeInMillis());
}
public static boolean isSameDayOfWeek(Calendar cal1, Calendar cal2){
int dayOfWeek1 = cal1.get(Calendar.DAY_OF_WEEK);
int dayOfWeek2 = cal2.get(Calendar.DAY_OF_WEEK);
return (dayOfWeek1 == dayOfWeek2);
}
public static long getTimeUnitDiff(Calendar cal1, Calendar cal2, TimeUnit timeUnit) {
long diffInMillies = cal1.getTime().getTime() - cal2.getTime().getTime();
return timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
}
public static String getFormattedDateAndTime(Calendar calendar, int format) {
String formattedTime = "";
switch (format) {
case FORMAT_ABSOLUTE:
formattedTime = getFormattedAbsoluteDateAndTime(calendar);
break;
case FORMAT_RELATIVE:
formattedTime = getFormattedRelativeDateAndTime(calendar);
break;
default:
break;
}
return formattedTime;
}
public static String getFormattedAbsoluteDateAndTime(Calendar calendar) {
String formattedAbsoluteDateAndTime;
long days = getTimeUnitDiff(calendar, Calendar.getInstance(), TimeUnit.DAYS);
if(days <= -7){
formattedAbsoluteDateAndTime = String.format("%s %s %s",
getDayOfWeek(calendar.get(Calendar.DAY_OF_WEEK)),
getFormattedDate(calendar),
getFormattedTime(calendar));
} else if(days>-7 && days<7){
if(isToday(calendar)){
formattedAbsoluteDateAndTime = getFormattedTime(calendar);
} else if(isSameDayOfWeek(calendar, Calendar.getInstance())){
formattedAbsoluteDateAndTime = String.format("%s %s %s",
getDayOfWeek(calendar.get(Calendar.DAY_OF_WEEK)),
getFormattedDate(calendar),
getFormattedTime(calendar));
} else {
formattedAbsoluteDateAndTime = String.format("%s %s", getDayOfWeek(calendar.get(Calendar.DAY_OF_WEEK)), getFormattedTime(calendar));
}
} else {
formattedAbsoluteDateAndTime = String.format("%s %s %s",
getDayOfWeek(calendar.get(Calendar.DAY_OF_WEEK)),
getFormattedDate(calendar),
getFormattedTime(calendar));
}
return formattedAbsoluteDateAndTime;
}
public static String getFormattedRelativeDateAndTime(Calendar calendar){
String formattedRelativeDateAndTime;
long days = getTimeUnitDiff(calendar, Calendar.getInstance(), TimeUnit.DAYS);
if(days<=-30){
formattedRelativeDateAndTime = getFormattedDate(calendar);
} else if(days>-30 && days<=-7){
formattedRelativeDateAndTime = String.format("%d days ago", Math.abs(days));
} else if(days>-7 && days<7){
long seconds = getTimeUnitDiff(calendar, Calendar.getInstance(), TimeUnit.SECONDS);
if(seconds>-60 && seconds<=0){
formattedRelativeDateAndTime = "Just now";
} else {
formattedRelativeDateAndTime = DateUtils.getRelativeTimeSpanString(calendar.getTimeInMillis(), System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS).toString();
}
} else if(days>=7 && days < 30){
formattedRelativeDateAndTime = String.format("In %d days", days);
} else {
formattedRelativeDateAndTime = getFormattedDate(calendar);
}
return formattedRelativeDateAndTime;
}
public static String getFormattedDate(Calendar calendar) {
String formattedDate;
String month = getMonth(calendar.get(Calendar.MONTH));
int day = calendar.get(Calendar.DAY_OF_MONTH);
int year = calendar.get(Calendar.YEAR);
if (isSameYear(calendar, Calendar.getInstance())) {
formattedDate = String.format("%s %d", month, day);
} else {
formattedDate = String.format("%s %d, %d", month, day, year);
}
return formattedDate;
}
public static String getFormattedTime(Calendar calendar) {
String formattedAbsoluteTime = String.format("%d:%02d %s",
getHour(calendar.get(Calendar.HOUR)),
calendar.get(Calendar.MINUTE),
getMeridiem(calendar.get(Calendar.AM_PM)));
return formattedAbsoluteTime;
}
private static String getMonth(int month) {
String[] months = LoopApplication.getInstance().getResources().getStringArray(R.array.months);
return months[month];
}
private static String getDayOfWeek(int dayOfWeek){
String[] days = LoopApplication.getInstance().getResources().getStringArray(R.array.days);
return days[dayOfWeek];
}
private static String getMeridiem(int meridiem){
String[] meridiems = LoopApplication.getInstance().getResources().getStringArray(R.array.meridiems);
return meridiems[meridiem];
}
private static int getHour(int h){
if(h == 0)
return 12;
else
return h;
}
}