/**
 * 便签小部件抽象基类，处理小部件生命周期和视图更新
 */
public abstract class NoteWidgetProvider extends AppWidgetProvider {
    // 数据库查询投影字段(对应笔记表的列)
    public static final String[] PROJECTION = new String[]{
            NoteColumns.ID,          // 笔记ID列
            NoteColumns.BG_COLOR_ID, // 背景颜色ID列
            NoteColumns.SNIPPET      // 内容摘要列
    };

    // 查询结果列的索引常量
    public static final int COLUMN_ID = 0;          // 笔记ID索引
    public static final int COLUMN_BG_COLOR_ID = 1; // 背景颜色ID索引
    public static final int COLUMN_SNIPPET = 2;     // 内容摘要索引

    private static final String TAG = "NoteWidgetProvider"; // 日志标签

    /**
     * 小部件被删除时的清理操作
     * @param context 上下文
     * @param appWidgetIds 被删除的小部件ID数组
     * 实现要点：解除笔记与小部件的关联
     */
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        ContentValues values = new ContentValues();
        values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); // 重置无效ID
        
        for (int widgetId : appWidgetIds) { // 遍历所有被删除的小部件
            context.getContentResolver().update(
                Notes.CONTENT_NOTE_URI,      // 笔记内容URI
                values,                      // 更新值集合
                NoteColumns.WIDGET_ID + "=?",// 按小部件ID筛选
                new String[]{String.valueOf(widgetId)}
            );
        }
    }

    /**
     * 获取小部件关联的笔记数据
     * @param context 上下文
     * @param widgetId 小部件ID
     * @return 包含笔记数据的Cursor对象
     * 查询规则：排除垃圾桶中的笔记
     */
    private Cursor getNoteWidgetInfo(Context context, int widgetId) {
        return context.getContentResolver().query(
            Notes.CONTENT_NOTE_URI,            // 笔记内容URI
            PROJECTION,                        // 查询字段
            NoteColumns.WIDGET_ID + "=? AND " + // 查询条件
            NoteColumns.PARENT_ID + "<>?",      // 排除垃圾桶
            new String[]{String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER)}, 
            null                                // 排序方式
        );
    }

    /**
     * 公开的小部件更新入口
     * @param context 上下文
     * @param appWidgetManager 小部件管理器
     * @param appWidgetIds 需要更新的小部件ID数组
     */
    protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        update(context, appWidgetManager, appWidgetIds, false); // 默认普通模式
    }

    /**
     * 实际执行更新逻辑
     * @param privacyMode 隐私模式开关（true时显示占位文本）
     */
    private void update(Context context, AppWidgetManager appWidgetManager, 
                      int[] appWidgetIds, boolean privacyMode) {
        for (int widgetId : appWidgetIds) { // 遍历处理每个小部件
            if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) continue;

            // 初始化默认值
            int bgId = ResourceParser.getDefaultBgId(context); // 获取默认背景
            String snippet = ""; // 内容摘要
            Intent intent = new Intent(context, NoteEditActivity.class); // 编辑意图
            intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // 单例模式
            intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, widgetId); // 传递小部件ID
            intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); // 小部件类型

            // 查询关联的笔记数据
            try (Cursor c = getNoteWidgetInfo(context, widgetId)) {
                if (c != null && c.moveToFirst()) {
                    // 数据校验：防止相同小部件ID关联多个笔记
                    if (c.getCount() > 1) {
                        Log.e(TAG, "小部件ID重复关联多个笔记:" + widgetId);
                        continue;
                    }
                    // 获取实际笔记数据
                    snippet = c.getString(COLUMN_SNIPPET); // 内容摘要
                    bgId = c.getInt(COLUMN_BG_COLOR_ID);   // 背景ID
                    intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); // 笔记ID
                    intent.setAction(Intent.ACTION_VIEW);  // 设置为查看模式
                } else {
                    // 没有关联笔记的处理
                    snippet = context.getString(R.string.widget_havenot_content);
                    intent.setAction(Intent.ACTION_INSERT_OR_EDIT); // 新建/编辑模式
                }
            }

            // 构建小部件视图
            RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId());
            rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); // 设置背景
            intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); // 传递背景给后续Activity

            // 构建点击事件
            PendingIntent pendingIntent;
            if (privacyMode) {
                // 隐私模式：显示占位文本，点击跳转到笔记列表
                rv.setTextViewText(R.id.widget_text, context.getString(R.string.widget_under_visit_mode));
                pendingIntent = PendingIntent.getActivity(context, widgetId, 
                    new Intent(context, NotesListActivity.class), // 跳转列表页
                    PendingIntent.FLAG_UPDATE_CURRENT);
            } else {
                // 正常模式：显示真实内容，点击打开对应笔记
                rv.setTextViewText(R.id.widget_text, snippet);
                pendingIntent = PendingIntent.getActivity(context, widgetId, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            }

            // 绑定点击事件
            rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent);
            
            // 更新小部件界面
            appWidgetManager.updateAppWidget(widgetId, rv);
        }
    }

    //----------- 抽象方法（子类必须实现） -----------
    /**
     * 获取背景资源ID（由具体主题小部件实现）
     * @param bgId 背景颜色标识符
     * @return 实际资源ID
     */
    protected abstract int getBgResourceId(int bgId);

    /**
     * 获取布局资源ID（由具体小部件类型实现）
     */
    protected abstract int getLayoutId();

    /**
     * 获取小部件类型标识（用于区分不同小部件）
     */
    protected abstract int getWidgetType();
}




