/*
 * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
 *
 * 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 net.micode.notes.ui;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.gtask.remote.GTaskSyncService;

/**
 * 设置和偏好活动，用于配置应用程序的偏好设置。
 */
public class NotesPreferenceActivity extends PreferenceActivity {
    // 偏好设置文件的名称
    public static final String PREFERENCE_NAME = "notes_preferences";
    // 同步账户名称的键
    public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name";
    // 最后一次同步时间的键
    public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time";
    // 设置背景颜色的键
    public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear";
    // 同步账户的键
    private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key";
    // 权限过滤键
    private static final String AUTHORITIES_FILTER_KEY = "authorities";
    // 账户类别
    private PreferenceCategory mAccountCategory;
    // GTask接收器
    private GTaskReceiver mReceiver;
    // 原始账户数组
    private Account[] mOriAccounts;
    // 是否添加了账户
    private boolean mHasAddedAccount;

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        /* 使用应用程序图标进行导航 */
        getActionBar().setDisplayHomeAsUpEnabled(true);

        // 从资源文件中添加偏好设置
        addPreferencesFromResource(R.xml.preferences);
        // 获取账户类别
        mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);
        // 创建GTask接收器
        mReceiver = new GTaskReceiver();
        // 创建意图过滤器
        IntentFilter filter = new IntentFilter();
        filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME);
        // 注册接收器
        registerReceiver(mReceiver, filter);

        // 初始化原始账户数组
        mOriAccounts = null;
        // 从XML布局文件中加载设置头部
        View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null);
        // 将头部添加到偏好列表中
        getListView().addHeaderView(header, null, true);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // 自动设置同步账户，如果用户添加了新账户
        if (mHasAddedAccount) {
            Account[] accounts = getGoogleAccounts();
            if (mOriAccounts != null && accounts.length > mOriAccounts.length) {
                for (Account accountNew : accounts) {
                    boolean found = false;
                    for (Account accountOld : mOriAccounts) {
                        if (TextUtils.equals(accountOld.name, accountNew.name)) {
                            found = true;
                            break;
                        }
                    }
                    if (!found) {
                        setSyncAccount(accountNew.name);
                        break;
                    }
                }
            }
        }

        // 刷新UI
        refreshUI();
    }

    @Override
    protected void onDestroy() {
        // 如果接收器不为空，注销接收器
        if (mReceiver != null) {
            unregisterReceiver(mReceiver);
        }
        super.onDestroy();
    }

    /**
     * 加载账户偏好设置。
     */
    private void loadAccountPreference() {
        // 移除所有账户偏好设置
        mAccountCategory.removeAll();

        // 创建一个新的偏好设置
        Preference accountPref = new Preference(this);
        // 获取默认账户
        final String defaultAccount = getSyncAccountName(this);
        accountPref.setTitle(getString(R.string.preferences_account_title));
        accountPref.setSummary(getString(R.string.preferences_account_summary));
        accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                // 如果GTask服务没有正在同步
                if (!GTaskSyncService.isSyncing()) {
                    // 如果默认账户为空
                    if (TextUtils.isEmpty(defaultAccount)) {
                        // 第一次设置账户
                        showSelectAccountAlertDialog();
                    } else {
                        // 如果账户已经设置，提示用户风险
                        showChangeAccountConfirmAlertDialog();
                    }
                } else {
                    // 提示用户不能更改账户
                    Toast.makeText(NotesPreferenceActivity.this,
                            R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT)
                            .show();
                }
                return true;
            }
        });

        // 将账户偏好设置添加到账户类别中
        mAccountCategory.addPreference(accountPref);
    }

    /**
     * 加载同步按钮。
     */
    private void loadSyncButton() {
        // 获取同步按钮和最后同步时间视图
        Button syncButton = (Button) findViewById(R.id.preference_sync_button);
        TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview);

        // 设置按钮状态
        if (GTaskSyncService.isSyncing()) {
            syncButton.setText(getString(R.string.preferences_button_sync_cancel));
            syncButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // 取消同步
                    GTaskSyncService.cancelSync(NotesPreferenceActivity.this);
                }
            });
        } else {
            syncButton.setText(getString(R.string.preferences_button_sync_immediately));
            syncButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // 立即同步
                    GTaskSyncService.startSync(NotesPreferenceActivity.this);
                }
            });
        }
        syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this)));

        // 设置最后同步时间
        if (GTaskSyncService.isSyncing()) {
            lastSyncTimeView.setText(GTaskSyncService.getProgressString());
            lastSyncTimeView.setVisibility(View.VISIBLE);
        } else {
            long lastSyncTime = getLastSyncTime(this);
            if (lastSyncTime != 0) {
                lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time,
                        DateFormat.format(getString(R.string.preferences_last_sync_time_format),
                                lastSyncTime)));
                lastSyncTimeView.setVisibility(View.VISIBLE);
            } else {
                lastSyncTimeView.setVisibility(View.GONE);
            }
        }
    }

    /**
     * 刷新UI。
     */
    private void refreshUI() {
        // 加载账户偏好设置和同步按钮
        loadAccountPreference();
        loadSyncButton();
    }

    /**
     * 显示选择账户的警告对话框。
     */
    private void showSelectAccountAlertDialog() {
        // 创建警告对话框的构建器
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

        // 从XML布局文件中加载标题视图
        View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null);
        TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);
        titleTextView.setText(getString(R.string.preferences_dialog_select_account_title));
        TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);
        subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips));

        // 设置自定义标题
        dialogBuilder.setCustomTitle(titleView);
        dialogBuilder.setPositiveButton(null, null);

        // 获取Google账户
        Account[] accounts = getGoogleAccounts());
        String defAccount = getSyncAccountName(this);

        // 初始化原始账户数组和添加账户标志
        mOriAccounts = accounts;
        mHasAddedAccount = false;

        // 如果账户数量大于0
        if (accounts.length > 0) {
            // 创建账户项
            CharSequence[] items = new CharSequence[accounts.length];
            final CharSequence[] itemMapping = items;
            int checkedItem = -1;
            int index = 0;
            for (Account account : accounts) {
                if (TextUtils.equals(account.name, defAccount)) {
                    checkedItem = index;
                }
                items[index++] = account.name;
            }
            // 设置单选项目
            dialogBuilder.setSingleChoiceItems(items, checkedItem,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            //设置同步账户
	setSyncAccount(itemMapping[which].toString());
	dialog.dismiss();
	refreshUI();
			}
		});
	}
    // 从XML布局文件中加载添加账户视图
    View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null);
    dialogBuilder.setView(addAccountView);

    // 显示警告对话框
    final AlertDialog dialog = dialogBuilder.show();
    addAccountView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // 添加账户
            mHasAddedAccount = true;
            Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");
            intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] {
                "gmail-ls"
            });
            startActivityForResult(intent, -1);
            dialog.dismiss();
        }
    });
}

/**
 * 显示更改账户的确认警告对话框。
 */
private void showChangeAccountConfirmAlertDialog() {
    // 创建警告对话框的构建器
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

    // 从XML布局文件中加载标题视图
    View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null);
    TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);
    titleTextView.setText(getString(R.string.preferences_dialog_change_account_title,
            getSyncAccountName(this)));
    TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);
    subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg));
    dialogBuilder.setCustomTitle(titleView);

    // 创建菜单项
    CharSequence[] menuItemArray = new CharSequence[] {
            getString(R.string.preferences_menu_change_account),
            getString(R.string.preferences_menu_remove_account),
            getString(R.string.preferences_menu_cancel)
    };
    dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            // 处理菜单项点击事件
            if (which == 0) {
                showSelectAccountAlertDialog();
            } else if (which == 1) {
                removeSyncAccount();
                refreshUI();
            }
        }
    });
    dialogBuilder.show();
}

/**
 * 获取Google账户。
 */
private Account[] getGoogleAccounts() {
    // 获取账户管理器
    AccountManager accountManager = AccountManager.get(this);
    // 获取Google账户
    return accountManager.getAccountsByType("com.google");
}

/**
 * 设置同步账户。
 */
private void setSyncAccount(String account) {
    // 如果同步账户不为空且与当前账户不同
    if (!getSyncAccountName(this).equals(account)) {
        // 获取共享首选项
        SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        if (account != null) {
            editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account);
        } else {
            editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, "");
        }
        editor.commit();

        // 清除最后同步时间
        setLastSyncTime(this, 0);

        // 清除本地gtask相关信息
        new Thread(new Runnable() {
            public void run() {
                ContentValues values = new ContentValues();
                values.put(NoteColumns.GTASK_ID, "");
                values.put(NoteColumns.SYNC_ID, 0);
                getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null);
            }
        }).start();

        // 提示用户设置账户成功
        Toast.makeText(NotesPreferenceActivity.this,
                getString(R.string.preferences_toast_success_set_accout, account),
                Toast.LENGTH_SHORT).show();
    }
}

/**
 * 移除同步账户。
 */
private void removeSyncAccount() {
    // 获取共享首选项
    SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) {
        editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME);
    }
    if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) {
        editor.remove(PREFERENCE_LAST_SYNC_TIME);
    }
    editor.commit();

    // 清除本地gtask相关信息
    new Thread(new Runnable() {
        public void run() {
            ContentValues values = new ContentValues();
            values.put(NoteColumns.GTASK_ID, "");
            values.put(NoteColumns.SYNC_ID, 0);
            getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null);
        }
    }).start();
}

/**
 * 获取同步账户名称。
 */
public static String getSyncAccountName(Context context) {
    SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
            Context.MODE_PRIVATE);
    return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, "");
}

/**
 * 设置最后同步时间。
 */
public static void setLastSyncTime(Context context, long time) {
    SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putLong(PREFERENCE_LAST_SYNC_TIME, time);
    editor.commit();
}

/**
 * 获取最后同步时间。
 */
public static long getLastSyncTime(Context context) {
    SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
            Context.MODE_PRIVATE);
    return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0);
}

/**
 * GTask接收器，用于接收GTask服务的广播。
 */
private class GTaskReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 刷新UI
        refreshUI();
        if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) {
            // 获取同步状态视图
            TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview);
            syncStatus.setText(intent
                    .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG));
        }

    }
}

/**
 * 处理选项菜单项点击事件。
 */
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = new Intent(this, NotesListActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return false;
    }
}
