/*
 * 版权所有 (c) 2010-2011，MiCode 开源社区 (www.micode.net)
 * 根据 Apache 许可证 2.0 版本（"许可证"）授权；
 * 除非符合许可证的规定，否则不得使用本文件。
 * 您可以从以下网址获取许可证副本：
 * http://www.apache.org/licenses/LICENSE-2.0
 * 除非适用法律要求或书面同意，本软件按"原样"分发，
 * 没有任何明示或暗示的保证或条件。
 * 详见许可证中规定的权限和限制。
 * （注：这是一份标准的Apache许可证2.0版本的开源声明）
 */
// 定义包路径
package net.micode.notes.ui;

// 导入Android相关类库
import android.app.AlarmManager;         // 系统闹钟服务
import android.app.PendingIntent;      // 延时意图，用于延迟执行操作
import android.content.BroadcastReceiver;  // 广播接收器基类
import android.content.ContentUris;     // Content URI工具类
import android.content.Context;         // 上下文对象
import android.content.Intent;          // 意图对象
import android.database.Cursor;         // 数据库游标

// 导入项目数据类
import net.micode.notes.data.Notes;    // 笔记常量定义
import net.micode.notes.data.Notes.NoteColumns;  // 笔记表列名定义

/**
 * 闹钟初始化接收器
 * 在系统启动或时区变更时重新设置所有未来的笔记提醒
 */
public class AlarmInitReceiver extends BroadcastReceiver {

    // 查询笔记的投影列（只需要ID和提醒日期）
    private static final String [] PROJECTION = new String [] {
            NoteColumns.ID,              // 笔记ID列
            NoteColumns.ALERTED_DATE     // 提醒日期列
    };

    // 列索引常量
    private static final int COLUMN_ID            = 0; // ID列索引
    private static final int COLUMN_ALERTED_DATE  = 1; // 提醒日期列索引

    /**
     * 广播接收回调方法
     * 当接收到BOOT_COMPLETED（系统启动完成）或TIMEZONE_CHANGED（时区变更）广播时触发
     *
     * @param context 上下文对象
     * @param intent  接收到的广播意图
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取当前系统时间
        long currentDate = System.currentTimeMillis();

        // 查询所有未来需要提醒的笔记（类型为普通笔记且提醒日期大于当前时间）
        Cursor c = context.getContentResolver().query(
                Notes.CONTENT_NOTE_URI,              // 笔记内容URI
                PROJECTION,                          // 查询的列
                NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE,
                new String[] { String.valueOf(currentDate)  }, // 参数：当前时间
                null);                               // 无排序要求

        // 处理查询结果
        if (c != null) {
            // 如果查询到数据
            if (c.moveToFirst())  {
                do {
                    // 获取笔记的提醒时间
                    long alertDate = c.getLong(COLUMN_ALERTED_DATE);

                    // 创建闹钟触发时要发送的广播意图
                    Intent sender = new Intent(context, AlarmReceiver.class);
                    // 设置数据URI为笔记的完整URI（content://xxx/notes/[id]）
                    sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
                            c.getLong(COLUMN_ID)));

                    // 创建PendingIntent用于延迟发送广播
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(
                            context,               // 上下文
                            0,                    // requestCode
                            sender,               // 要发送的Intent
                            0);                   // flags

                    // 获取系统闹钟服务
                    AlarmManager alermManager = (AlarmManager) context
                            .getSystemService(Context.ALARM_SERVICE);

                    // 设置闹钟（RTC_WAKEUP表示即使设备休眠也唤醒CPU）
                    alermManager.set(
                            AlarmManager.RTC_WAKEUP,  // 使用实时时钟并在触发时唤醒设备
                            alertDate,               // 触发时间
                            pendingIntent);          // 触发时要执行的PendingIntent

                } while (c.moveToNext());   // 处理下一条记录
            }
            // 关闭游标释放资源
            c.close();
        }
    }
}
