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

// 声明当前Java文件所在的包路径（net.micode.notes.ui 表示笔记应用的UI层）
package net.micode.notes.ui;
// Android注解库，@SuppressLint用于忽略特定Lint警告
import android.annotation.SuppressLint;
// Android上下文类，提供应用环境信息和访问系统服务
import android.content.Context;
// Android日期/时间格式化工具类，用于友好显示时间
import android.text.format.DateUtils;
// Android基础视图类，所有UI组件的基类
import android.view.View;
// 复选框控件，用于多选操作
import android.widget.CheckBox;
// 图片视图控件，用于显示图标
import android.widget.ImageView;
// 线性布局容器，用于水平或垂直排列子视图
import android.widget.LinearLayout;
// 文本视图控件，用于显示文字内容
import android.widget.TextView;
// 导入应用R资源文件（自动生成，包含所有资源ID）
import net.micode.notes.R;
// 导入笔记数据模型和常量定义
import net.micode.notes.data.Notes;
// 导入数据工具类，提供数据处理方法
import net.micode.notes.tool.DataUtils;
// 导入笔记项背景资源定义类
import net.micode.notes.tool.ResourceParser.NoteItemBgResources;

/**
 * 自定义笔记列表项视图组件
 * 继承自LinearLayout，展示单条笔记/文件夹的完整信息
 */
public class NotesListItem extends LinearLayout {
    // 提醒图标（显示时钟或通话记录图标）
    private final ImageView mAlert;
    // 标题/内容文本视图
    private final TextView mTitle;
    // 时间文本视图（显示相对时间）
    private final TextView mTime;
    // 通话记录联系人名称（仅通话记录可见）
    private final TextView mCallName;
    // 当前绑定的笔记数据对象
    private NoteItemData mItemData;
    // 多选模式下的复选框
    private final CheckBox mCheckBox;

    /**
     * 构造函数
     * @param context 上下文环境
     */
    public NotesListItem(Context context) {
        super(context);
        // 加载布局文件（R.layout.note_item ）到当前视图
        inflate(context, R.layout.note_item,  this);

        // 初始化视图组件
        mAlert = findViewById(R.id.iv_alert_icon);         // 提醒图标
        mTitle = findViewById(R.id.tv_title);            // 标题文本
        mTime = findViewById(R.id.tv_time);               // 时间文本
        mCallName = findViewById(R.id.tv_name);          // 联系人名称
        mCheckBox = findViewById(android.R.id.checkbox);//  多选复选框
    }

    /**
     * 绑定数据到视图
     * @param context 上下文
     * @param data 笔记数据对象
     * @param choiceMode 是否处于多选模式
     * @param checked 是否被选中
     */
    @SuppressLint("SetTextI18n") // 忽略国际化的Lint警告
    public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) {
        // 处理多选模式显示逻辑
        if (choiceMode && data.getType()  == Notes.TYPE_NOTE) {
            mCheckBox.setVisibility(View.VISIBLE);  // 显示复选框
            mCheckBox.setChecked(checked);          // 设置选中状态
        } else {
            mCheckBox.setVisibility(View.GONE);     // 隐藏复选框
        }

        mItemData = data; // 保存数据引用

        // 判断笔记类型并设置不同显示样式
        if (data.getId()  == Notes.ID_CALL_RECORD_FOLDER) {
            // 通话记录文件夹的特殊处理
            mCallName.setVisibility(View.GONE);  // 隐藏联系人名称
            mAlert.setVisibility(View.VISIBLE);  // 显示提醒图标
            // 设置标题样式和内容
            mTitle.setTextAppearance(context,  R.style.TextAppearancePrimaryItem);
            mTitle.setText(context.getString(R.string.call_record_folder_name)
                    + context.getString(R.string.format_folder_files_count,  data.getNotesCount()));
            mAlert.setImageResource(R.drawable.call_record);  // 设置通话记录图标
        } else if (data.getParentId()  == Notes.ID_CALL_RECORD_FOLDER) {
            // 通话记录笔记的特殊处理
            mCallName.setVisibility(View.VISIBLE);  // 显示联系人名称
            mCallName.setText(data.getCallName());   // 设置联系人名称
            // 设置次级标题样式
            mTitle.setTextAppearance(context,  R.style.TextAppearanceSecondaryItem);
            mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));  // 设置内容摘要
            // 处理提醒图标显示
            if (data.hasAlert())  {
                mAlert.setImageResource(R.drawable.clock);  // 设置时钟图标
                mAlert.setVisibility(View.VISIBLE);
            } else {
                mAlert.setVisibility(View.GONE);
            }
        } else {
            // 普通笔记/文件夹的处理
            mCallName.setVisibility(View.GONE);  // 隐藏联系人名称
            // 设置主标题样式
            mTitle.setTextAppearance(context,  R.style.TextAppearancePrimaryItem);

            if (data.getType()  == Notes.TYPE_FOLDER) {
                // 文件夹的特殊处理
                mTitle.setText(data.getSnippet()  + context.getString(R.string.format_folder_files_count,
                        data.getNotesCount()));  // 显示文件夹名+笔记数
                mAlert.setVisibility(View.GONE);  // 隐藏提醒图标
            } else {
                // 普通笔记的处理
                mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));  // 设置内容摘要
                // 处理提醒图标显示
                if (data.hasAlert())  {
                    mAlert.setImageResource(R.drawable.clock);  // 设置时钟图标
                    mAlert.setVisibility(View.VISIBLE);
                } else {
                    mAlert.setVisibility(View.GONE);
                }
            }
        }

        // 设置相对时间显示（如"2分钟前"）
        mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));

        // 设置背景样式
        setBackground(data);
    }

    /**
     * 根据笔记位置设置不同背景样式
     * @param data 笔记数据对象
     */
    private void setBackground(NoteItemData data) {
        int id = data.getBgColorId();  // 获取背景颜色ID
        if (data.getType()  == Notes.TYPE_NOTE) {
            // 笔记项的背景处理
            if (data.isSingle()  || data.isOneFollowingFolder())  {
                // 单一项或紧接文件夹的项
                setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));
            } else if (data.isLast())  {
                // 最后一项
                setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));
            } else if (data.isFirst()  || data.isMultiFollowingFolder())  {
                // 第一项或跟随多文件夹的项
                setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));
            } else {
                // 普通中间项
                setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));
            }
        } else {
            // 文件夹项的背景
            setBackgroundResource(NoteItemBgResources.getFolderBgRes());
        }
    }

    /**
     * 获取当前绑定的笔记数据
     * @return 笔记数据对象
     */
    public NoteItemData getItemData() {
        return mItemData;
    }
}
