/*
 * Copyright (C) 2012 Google Inc.
 * Licensed to The Android Open Source Project.
 *
 * 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.android.mail;

import android.content.Context;
import android.content.res.Resources;
import android.text.format.DateUtils;
import android.text.format.Time;

import java.util.Formatter;

/**
 * Convenience class to efficiently make multiple short date strings. Instantiating and reusing
 * one of these builders is faster than repeatedly bringing up all the locale stuff.
 *
 */
public class FormattedDateBuilder {

    private StringBuilder sb;
    private Formatter dateFormatter;
    private Context mContext;

    public FormattedDateBuilder(Context context) {
        mContext = context;
        sb = new StringBuilder();
        dateFormatter = new Formatter(sb);
    }

    public CharSequence formatShortDate(long when) {
        return DateUtils.getRelativeTimeSpanString(mContext, when);
    }

    public CharSequence formatLongDateTime(long when) {
        final Resources resources = mContext.getResources();

        if (DateUtils.isToday(when)) {
            return resources.getString(R.string.date_message_received_today, formatLongTime(when));
        } else if (isYesterday(when)) {
            return resources.getString(
                    R.string.date_message_received_yesterday, formatLongTime(when));
        } else {
            return resources.getString(R.string.date_message_received,
                    formatLongDayAndDate(when), formatLongTime(when));
        }
    }

    public CharSequence formatLongDayAndDate(long when) {
        sb.setLength(0);
        DateUtils.formatDateRange(mContext, dateFormatter, when, when,
                DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY
                        | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_ABBREV_ALL);
        return sb.toString();
    }

    public CharSequence formatLongTime(long when) {
        sb.setLength(0);
        DateUtils.formatDateRange(mContext, dateFormatter, when, when,
                DateUtils.FORMAT_SHOW_TIME);
        return sb.toString();
    }

    /**
     * @return true if the supplied when is today else false
     */
    private static boolean isYesterday(long when) {
        final Time time = new Time();
        time.set(when);

        final int thenYear = time.year;
        final int thenMonth = time.month;
        final int thenMonthDay = time.monthDay;

        time.set(System.currentTimeMillis());
        return (thenYear == time.year)
                && (thenMonth == time.month)
                && (thenMonthDay == (time.monthDay-1));
    }
}
