/*
 * 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.app.Activity;
import android.app.AlertDialog;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
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.tool.DataUtils;

/**
 * 回收站Activity
 * 用于显示和管理已删除的便签
 * 
 * 功能说明：
 * 1. 显示所有已删除的便签列表
 * 2. 支持恢复单个便签
 * 3. 支持彻底删除单个便签
 * 4. 支持清空所有回收站便签
 */
public class TrashActivity extends Activity implements OnClickListener {
    /** 日志标签，用于调试和日志输出 */
    private static final String TAG = "TrashActivity";
    
    /** 回收站列表查询的Token标识 */
    private static final int TRASH_LIST_QUERY_TOKEN = 0;
    
    /** 返回按钮控件 */
    private Button mReturnButton;
    /** 清空所有按钮控件 */
    private Button mCleanAllButton;
    /** 回收站列表视图 */
    private ListView mTrashListView;
    /** 回收站列表适配器 */
    private NotesListAdapter mTrashListAdapter;
    /** 内容解析器，用于访问数据库 */
    private ContentResolver mContentResolver;
    /** 后台查询处理器，用于异步查询回收站数据 */
    private BackgroundQueryHandler mBackgroundQueryHandler;

    /**
     * Activity创建时的回调方法
     * 初始化界面布局和资源
     * 
     * @param savedInstanceState 保存的实例状态
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置布局文件
        setContentView(R.layout.activity_trash);
        // 初始化界面控件和资源
        initResources();
    }

    /**
     * Activity启动时的回调方法
     * 当Activity可见时，开始异步查询回收站列表
     */
    @Override
    protected void onStart() {
        super.onStart();
        // 启动异步查询回收站列表
        startAsyncTrashListQuery();
    }

    /**
     * 初始化界面控件和资源
     * 绑定控件、设置监听器、创建适配器
     */
    private void initResources() {
        // 获取内容解析器
        mContentResolver = this.getContentResolver();
        // 创建后台查询处理器
        mBackgroundQueryHandler = new BackgroundQueryHandler(mContentResolver);
        
        // 绑定返回按钮
        mReturnButton = (Button) findViewById(R.id.btn_return);
        if (mReturnButton != null) {
            mReturnButton.setOnClickListener(this);
        }
        
        // 绑定清空所有按钮
        mCleanAllButton = (Button) findViewById(R.id.btn_clean_all);
        if (mCleanAllButton != null) {
            mCleanAllButton.setOnClickListener(this);
        }
        
        // 绑定回收站列表视图
        mTrashListView = (ListView) findViewById(R.id.trash_list);
        if (mTrashListView != null) {
            // 创建列表适配器
            mTrashListAdapter = new NotesListAdapter(this);
            // 设置适配器
            mTrashListView.setAdapter(mTrashListAdapter);
            // 设置列表项点击监听器
            mTrashListView.setOnItemClickListener(new OnTrashItemClickListener());
        }
    }

    /**
     * 启动异步查询回收站列表
     * 使用后台查询处理器异步查询回收站数据，按修改时间降序排列
     */
    private void startAsyncTrashListQuery() {
        mBackgroundQueryHandler.startQuery(TRASH_LIST_QUERY_TOKEN, null,
                Notes.CONTENT_TRASH_URI, NoteItemData.PROJECTION, null, null,
                NoteColumns.MODIFIED_DATE + " DESC");
    }

    /**
     * 后台查询处理器内部类
     * 继承自AsyncQueryHandler，用于在后台线程执行数据库查询操作
     */
    private final class BackgroundQueryHandler extends AsyncQueryHandler {
        /**
         * 构造函数
         * @param contentResolver 内容解析器
         */
        public BackgroundQueryHandler(ContentResolver contentResolver) {
            super(contentResolver);
        }

        /**
         * 查询完成时的回调方法
         * 在主线程中更新UI
         * 
         * @param token 查询Token标识
         * @param cookie 查询时传递的Cookie对象
         * @param cursor 查询结果游标
         */
        @Override
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
            switch (token) {
                case TRASH_LIST_QUERY_TOKEN:
                    // 更新列表适配器的游标，刷新列表显示
                    mTrashListAdapter.changeCursor(cursor);
                    break;
                default:
                    break;
            }
        }
    }

    /**
     * 回收站列表项点击监听器
     * 处理列表项的点击事件，显示操作对话框
     */
    private class OnTrashItemClickListener implements OnItemClickListener {
        /**
         * 列表项点击事件处理
         * 
         * @param parent 父适配器视图
         * @param view 被点击的视图
         * @param position 点击位置
         * @param id 列表项ID
         */
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // 检查视图是否为NotesListItem类型
            if (view instanceof NotesListItem) {
                // 获取列表项数据
                NoteItemData item = ((NotesListItem) view).getItemData();
                // 显示操作对话框
                showTrashItemDialog(item);
            }
        }
    }

    /**
     * 显示回收站便签操作对话框
     * 提供删除和恢复两个选项
     * 
     * @param item 便签项数据
     */
    private void showTrashItemDialog(final NoteItemData item) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 设置对话框标题为便签摘要
        builder.setTitle(item.getSnippet());
        // 设置操作选项：删除和恢复
        builder.setItems(new String[] {
                getString(R.string.menu_delete),
                getString(R.string.button_recovery)
        }, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0: // 彻底删除选项
                        permanentlyDeleteNote(item.getId());
                        break;
                    case 1: // 恢复选项
                        recoverNote(item.getId());
                        break;
                }
            }
        });
        // 显示对话框
        builder.show();
    }

    /**
     * 彻底删除便签
     * 从回收站中永久删除指定的便签，此操作不可恢复
     * 
     * @param noteId 要删除的便签ID
     */
    private void permanentlyDeleteNote(long noteId) {
        // 调用工具类方法彻底删除便签
        if (DataUtils.permanentlyDeleteFromTrash(mContentResolver, noteId, this)) {
            // 删除成功，显示提示信息
            Toast.makeText(this, getString(R.string.menu_delete) + " " + getString(R.string.menu_success), 
                    Toast.LENGTH_SHORT).show();
            // 刷新列表显示
            startAsyncTrashListQuery();
        } else {
            // 删除失败，显示错误提示
            Toast.makeText(this, getString(R.string.menu_delete) + " " + getString(R.string.failed_sdcard_export), 
                    Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 恢复便签
     * 将便签从回收站恢复到正常笔记列表
     * 
     * @param noteId 要恢复的便签ID
     */
    private void recoverNote(long noteId) {
        // 调用工具类方法恢复便签
        if (DataUtils.restoreNoteFromTrash(mContentResolver, noteId, this)) {
            // 恢复成功，显示提示信息
            Toast.makeText(this, getString(R.string.button_recovery) + " " + getString(R.string.menu_success), 
                    Toast.LENGTH_SHORT).show();
            // 刷新列表显示
            startAsyncTrashListQuery();
        } else {
            // 恢复失败，显示错误提示
            Toast.makeText(this, getString(R.string.button_recovery) + " " + getString(R.string.failed_sdcard_export), 
                    Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 显示清空所有回收站的确认对话框
     * 提醒用户此操作不可恢复
     */
    private void showClearAllTrashDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 设置对话框标题
        builder.setTitle(getString(R.string.button_clean_all));
        // 设置对话框消息，提醒用户此操作不可恢复
        builder.setMessage(getString(R.string.alert_message_clear_all_trash));
        // 设置确认按钮
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 用户确认后执行清空操作
                        clearAllTrash();
                    }
                });
        // 设置取消按钮
        builder.setNegativeButton(android.R.string.cancel, null);
        // 显示对话框
        builder.show();
    }

    /**
     * 清空所有回收站便签
     * 永久删除回收站中的所有便签，此操作不可恢复
     */
    private void clearAllTrash() {
        // 调用工具类方法清空所有回收站便签
        if (DataUtils.clearAllTrash(mContentResolver, this)) {
            // 清空成功，显示提示信息
            Toast.makeText(this, getString(R.string.button_clean_all) + " " + getString(R.string.menu_success), 
                    Toast.LENGTH_SHORT).show();
            // 刷新列表显示，清空UI
            startAsyncTrashListQuery();
        } else {
            // 清空失败，显示错误提示
            Toast.makeText(this, getString(R.string.button_clean_all) + " " + getString(R.string.failed_sdcard_export), 
                    Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 按钮点击事件处理
     * 处理返回按钮和清空所有按钮的点击事件
     * 
     * @param v 被点击的视图
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_return:
                // 返回按钮：关闭当前Activity
                finish();
                break;
            case R.id.btn_clean_all:
                // 清空所有按钮：显示确认对话框
                showClearAllTrashDialog();
                break;
            default:
                break;
        }
    }
}