njomeau/zuluzulu

View on GitHub
app/src/main/java/ch/epfl/sweng/zuluzulu/structure/EventDate.java

Summary

Maintainability
A
45 mins
Test Coverage
package ch.epfl.sweng.zuluzulu.structure;

import com.google.firebase.Timestamp;

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

/**
 * represent a date of an event
 */
public class EventDate implements Serializable {
    private static final String DATE_TIME_PATTERN = "dd.MM.yyyy HH:mm:ss";
    private static final String DATE_TIME_READ_HOURS = "dd.MM.yyyy HH:mm";
    private static final String DATE_TIME_READ_NO_HOURS = "dd.MM.yyyy";

    private Date startDate;
    private Date endDate;

    /**
     * Create an Event date
     *
     * @param start_date start date
     * @param end_date   end date
     */
    public EventDate(String start_date, String end_date) {
        this(start_date, "", end_date, "");
    }

    /**
     * Create an EventDate
     *
     * @param start start date
     * @param end   start date
     */
    public EventDate(Date start, Date end) {
        assert (start != null);
        assert (end != null);

        this.setStartDate(start);
        this.setEndDate(end);
    }

    /**
     * Create an EventDate
     *
     * @param start_date start date
     * @param start_time start time
     * @param end_date   end date
     * @param end_time   end time
     */
    public EventDate(String start_date, String start_time, String end_date, String end_time) {
        this(stringToStartDate(start_date, start_time), stringToEndDate(end_date, end_time));
    }

    /**
     * Set start date
     *
     * @param start_date_string start date
     * @param start_time_string start time
     */
    private static Date stringToStartDate(String start_date_string, String start_time_string) {
        if (start_date_string == null || "2018-01-01".length() != start_date_string.length()) {
            throw new IllegalArgumentException();
        }
        assert (start_time_string != null);

        String date = start_date_string;

        if ("hh:mm:ss".length() == start_time_string.length()) {
            date = date + " " + start_time_string;
        } else {
            date = date + " 00:00:01";
        }

        return createDate(date);
    }

    /**
     * Set end date
     *
     * @param end_date_string end date
     * @param end_time_string end time
     */
    private static Date stringToEndDate(String end_date_string, String end_time_string) {
        checkDateStringInput(end_date_string, end_time_string);

        String date = end_date_string;

        if (end_time_string.length() == "hh:mm:ss".length()) {
            date = date + " " + end_time_string;
        } else {
            date = date + " 23:59:59";
        }

        return createDate(date);
    }

    private static void checkDateStringInput(String date, String time) {
        if (date == null || "2018-01-01".length() != date.length()) {
            throw new IllegalArgumentException();
        }
        assert (time != null);
    }

    /**
     * Create date from string
     *
     * @param date Date
     * @return String
     */
    private static Date createDate(String date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_TIME_PATTERN);

        Date start_date;
        try {
            start_date = simpleDateFormat.parse(date);
        } catch (ParseException e) {
            throw new IllegalArgumentException();
        }
        return start_date;
    }

    /**
     * return the start date
     *
     * @return Date
     */
    public Date getStartDate() {
        return startDate;
    }

    /**
     * Set start date
     *
     * @param startDate Date
     */
    private void setStartDate(Date startDate) {
        assert (startDate != null);
        this.startDate = startDate;
    }

    /**
     * Get date string format
     *
     * @return String
     */
    public String getStartDateString() {
        return DateToString(startDate);
    }

    /**
     * getAndAddOnSuccessListener End date as string
     *
     * @return string
     */
    public String getEndDateString() {
        return DateToString(endDate);
    }

    /**
     * Create String from date
     *
     * @param date date
     * @return String
     */
    private String DateToString(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_TIME_PATTERN);
        return simpleDateFormat.format(date);
    }

    /**
     * getAndAddOnSuccessListener end date
     *
     * @return Date
     */
    public Date getEndDate() {
        return endDate;
    }

    /**
     * set end date
     *
     * @param endDate end date
     */
    public void setEndDate(Date endDate) {
        if (endDate == null) {
            throw new IllegalArgumentException();
        }
        this.endDate = endDate;
    }

    public String getDateTimeUser(boolean fullDate) {
        StringBuilder sb = new StringBuilder();

        long nb_hours = (getStartDate().getTime() - new Date().getTime()) / 3600000;
        long nb_days = nb_hours / 24;

        if (nb_days <= 30 && !fullDate) {
            printTimeRemaining(nb_days, nb_hours, sb);
        } else {
            printDateStart(sb);
        }
        return sb.toString();
    }

    private void printTimeRemaining(long nb_days, long nb_hours, StringBuilder sb) {
        long nb_hours_end = (getEndDate().getTime() - new Date().getTime()) / 3600000;
        long nb_days_end = nb_hours_end / 24;

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(Timestamp.now().toDate());
        int dayActu = calendar.get(Calendar.DAY_OF_MONTH);

        calendar.setTime(getStartDate());
        int dayOfEvent = calendar.get(Calendar.DAY_OF_MONTH);
        int hourOfEvent = calendar.get(Calendar.HOUR_OF_DAY);
        String minuteOfDay = String.format("%02d", calendar.get(Calendar.MINUTE));

        if (nb_days <= 0) {
            if (nb_hours_end <= 0)
                sb.append("Terminé");
            else if (nb_hours <= 0)
                sb.append("Maintenant - ").append(dateRemoveZeroHour(getEndDate()));
            else {
                if (dayActu - dayOfEvent == 0)
                    sb.append("Aujourd'hui à ").append(hourOfEvent).append("h").append(minuteOfDay).append(" (dans ").append(nb_hours).append(" heures)");
                else
                    sb.append("Demain à ").append(hourOfEvent).append("h").append(minuteOfDay).append(" (dans ").append(nb_hours).append(" heures)");
            }
        } else
            sb.append("Dans ").append(nb_days).append(" jours");
    }

    private void printDateStart(StringBuilder sb) {
        if (!getEndDateString().equals(getStartDateString()) && endDate.getSeconds() != 59) {
            sb.append("Du ");
        } else {
            sb.append("Le ");
        }

        sb.append(dateRemoveZeroHour(startDate));

        if (!getEndDateString().equals(getStartDateString()) && endDate.getSeconds() != 59) {
            sb.append(" au ");
            sb.append(dateRemoveZeroHour(endDate));
        }
    }

    private String dateRemoveZeroHour(Date date) {
        if (startDate.getHours() != 0) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_TIME_READ_HOURS);
            return (simpleDateFormat.format(date));
        } else {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_TIME_READ_NO_HOURS);
            return (simpleDateFormat.format(date));
        }
    }
}