/*
 * Copyright (C) 2011 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.calendar;

import android.app.Activity;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.text.format.DateFormat;
import android.text.format.Time;
import android.util.Log;
import android.widget.TimePicker;

public class OtherPreferences extends PreferenceFragment  implements OnPreferenceChangeListener{
    private static final String TAG = "CalendarOtherPreferences";

    // The name of the shared preferences file. This name must be maintained for
    // historical reasons, as it's what PreferenceManager assigned the first
    // time the file was created.
    static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";

    // Must be the same keys that are used in the other_preferences.xml file.
    public static final String KEY_OTHER_COPY_DB = "preferences_copy_db";
    public static final String KEY_OTHER_QUIET_HOURS = "preferences_reminders_quiet_hours";
    public static final String KEY_OTHER_REMINDERS_RESPONDED = "preferences_reminders_responded";
    public static final String KEY_OTHER_QUIET_HOURS_START =
            "preferences_reminders_quiet_hours_start";
    public static final String KEY_OTHER_QUIET_HOURS_START_HOUR =
            "preferences_reminders_quiet_hours_start_hour";
    public static final String KEY_OTHER_QUIET_HOURS_START_MINUTE =
            "preferences_reminders_quiet_hours_start_minute";
    public static final String KEY_OTHER_QUIET_HOURS_END =
            "preferences_reminders_quiet_hours_end";
    public static final String KEY_OTHER_QUIET_HOURS_END_HOUR =
            "preferences_reminders_quiet_hours_end_hour";
    public static final String KEY_OTHER_QUIET_HOURS_END_MINUTE =
            "preferences_reminders_quiet_hours_end_minute";
    public static final String KEY_OTHER_1 = "preferences_tardis_1";

    public static final int QUIET_HOURS_DEFAULT_START_HOUR = 22;
    public static final int QUIET_HOURS_DEFAULT_START_MINUTE = 0;
    public static final int QUIET_HOURS_DEFAULT_END_HOUR = 8;
    public static final int QUIET_HOURS_DEFAULT_END_MINUTE = 0;

    private static final int START_LISTENER = 1;
    private static final int END_LISTENER = 2;
    private static final String format24Hour = "%H:%M";
    private static final String format12Hour = "%I:%M%P";

    private Preference mCopyDb;
    private CheckBoxPreference mQuietHours;
    private Preference mQuietHoursStart;
    private Preference mQuietHoursEnd;

    private TimePickerDialog mTimePickerDialog;
    private TimeSetListener mQuietHoursStartListener;
    private TimePickerDialog mQuietHoursStartDialog;
    private TimeSetListener mQuietHoursEndListener;
    private TimePickerDialog mQuietHoursEndDialog;
    private boolean mIs24HourMode;

    public OtherPreferences() {
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        PreferenceManager manager = getPreferenceManager();
        manager.setSharedPreferencesName(SHARED_PREFS_NAME);
        SharedPreferences prefs = manager.getSharedPreferences();

        addPreferencesFromResource(R.xml.other_preferences);
        mCopyDb = findPreference(KEY_OTHER_COPY_DB);

        Activity activity = getActivity();
        if (activity == null) {
            Log.d(TAG, "Activity was null");
        }
        mIs24HourMode = DateFormat.is24HourFormat(activity);

        mQuietHours =
                (CheckBoxPreference) findPreference(KEY_OTHER_QUIET_HOURS);

        int startHour = prefs.getInt(KEY_OTHER_QUIET_HOURS_START_HOUR,
                QUIET_HOURS_DEFAULT_START_HOUR);
        int startMinute = prefs.getInt(KEY_OTHER_QUIET_HOURS_START_MINUTE,
                QUIET_HOURS_DEFAULT_START_MINUTE);
        mQuietHoursStart = findPreference(KEY_OTHER_QUIET_HOURS_START);
        mQuietHoursStartListener = new TimeSetListener(START_LISTENER);
        mQuietHoursStartDialog = new TimePickerDialog(
                activity, mQuietHoursStartListener,
                startHour, startMinute, mIs24HourMode);
        mQuietHoursStart.setSummary(formatTime(startHour, startMinute));

        int endHour = prefs.getInt(KEY_OTHER_QUIET_HOURS_END_HOUR,
                QUIET_HOURS_DEFAULT_END_HOUR);
        int endMinute = prefs.getInt(KEY_OTHER_QUIET_HOURS_END_MINUTE,
                QUIET_HOURS_DEFAULT_END_MINUTE);
        mQuietHoursEnd = findPreference(KEY_OTHER_QUIET_HOURS_END);
        mQuietHoursEndListener = new TimeSetListener(END_LISTENER);
        mQuietHoursEndDialog = new TimePickerDialog(
                activity, mQuietHoursEndListener,
                endHour, endMinute, mIs24HourMode);
        mQuietHoursEnd.setSummary(formatTime(endHour, endMinute));
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object objValue) {
        return true;
    }

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
        if (preference == mCopyDb) {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.setComponent(new ComponentName("com.android.providers.calendar",
                    "com.android.providers.calendar.CalendarDebugActivity"));
            startActivity(intent);
        } else if (preference == mQuietHoursStart) {
            if (mTimePickerDialog == null) {
                mTimePickerDialog = mQuietHoursStartDialog;
                mTimePickerDialog.show();
            } else {
                Log.v(TAG, "not null");
            }
        } else if (preference == mQuietHoursEnd) {
            if (mTimePickerDialog == null) {
                mTimePickerDialog = mQuietHoursEndDialog;
                mTimePickerDialog.show();
            } else {
                Log.v(TAG, "not null");
            }
        } else {
            return super.onPreferenceTreeClick(screen, preference);
        }
        return true;
    }

    private class TimeSetListener implements TimePickerDialog.OnTimeSetListener {
        private int mListenerId;

        public TimeSetListener(int listenerId) {
            mListenerId = listenerId;
        }

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            mTimePickerDialog = null;

            SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
            SharedPreferences.Editor editor = prefs.edit();

            String summary = formatTime(hourOfDay, minute);
            switch (mListenerId) {
                case (START_LISTENER):
                    mQuietHoursStart.setSummary(summary);
                    editor.putInt(KEY_OTHER_QUIET_HOURS_START_HOUR, hourOfDay);
                    editor.putInt(KEY_OTHER_QUIET_HOURS_START_MINUTE, minute);
                    break;
                case (END_LISTENER):
                    mQuietHoursEnd.setSummary(summary);
                    editor.putInt(KEY_OTHER_QUIET_HOURS_END_HOUR, hourOfDay);
                    editor.putInt(KEY_OTHER_QUIET_HOURS_END_MINUTE, minute);
                    break;
                default:
                    Log.d(TAG, "Set time for unknown listener: "+mListenerId);
            }

            editor.commit();
        }
    }

    /**
     * @param hourOfDay the hour of the day (0-24)
     * @param minute
     * @return human-readable string formatted based on 24-hour mode.
     */
    private String formatTime(int hourOfDay, int minute) {
        Time time = new Time();
        time.hour = hourOfDay;
        time.minute = minute;

        String format = mIs24HourMode? format24Hour : format12Hour;
        return time.format(format);
    }
}
