/*
 * Copyright (C) 2014 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.example.android.automessagingdemo;

import android.content.Context;
import android.content.SharedPreferences;

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

/**
 * A simple logger that uses shared preferences to log messages, their reads
 * and replies. Don't use this in a real world application. This logger is only
 * used for displaying the messages in the text view.
 */
public class MessageLogger {

    private static final String PREF_MESSAGE = "MESSAGE_LOGGER";
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static final String LOG_KEY = "message_data";
    public static final String LINE_BREAKS = "\n\n";

    public static void logMessage(Context context, String message) {
        SharedPreferences prefs = getPrefs(context);
        message = DATE_FORMAT.format(new Date(System.currentTimeMillis())) + ": " + message;
        prefs.edit()
                .putString(LOG_KEY, prefs.getString(LOG_KEY, "") + LINE_BREAKS + message)
                .apply();
    }

    public static SharedPreferences getPrefs(Context context) {
        return context.getSharedPreferences(PREF_MESSAGE, Context.MODE_PRIVATE);
    }

    public static String getAllMessages(Context context) {
        return getPrefs(context).getString(LOG_KEY, "");
    }

    public static void clear(Context context) {
        getPrefs(context).edit().remove(LOG_KEY).apply();
    }
}
