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

// 定义MetaData类所在的包路径
package net.micode.notes.gtask.data;

// 导入Android数据库Cursor类
import android.database.Cursor;
// 导入Android日志工具类
import android.util.Log;

// 导入应用中自定义的字符串工具类
import net.micode.notes.tool.GTaskStringUtils;

// 导入JSON处理相关类
import org.json.JSONException;
import org.json.JSONObject;

/**
 * MetaData类 - 继承自Task类
 * 功能：处理Google Tasks元数据信息
 * 特性：
 * 1. 存储关联任务的GID（Google ID）
 * 2. 将元数据信息以JSON格式存储在notes字段中
 * 3. 仅用于远程数据同步，不支持本地操作
 */
public class MetaData extends Task {
    // 日志标签，使用类名作为标识
    private final static String TAG = MetaData.class.getSimpleName();

    // 存储关联任务的Google ID
    private String mRelatedGid = null;

    /**
     * 设置元数据信息
     * @param gid 关联任务的Google ID
     * @param metaInfo 包含元数据的JSON对象
     */
    public void setMeta(String gid, JSONObject metaInfo) {
        try {
            // 将GID添加到元数据JSON中
            metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID,  gid);
        } catch (JSONException e) {
            Log.e(TAG, "failed to put related gid"); // 记录错误日志
        }
        // 将JSON对象转为字符串存储到notes字段
        setNotes(metaInfo.toString());
        // 设置固定名称标识这是一个元数据任务
        setName(GTaskStringUtils.META_NOTE_NAME);
    }

    /**
     * 获取关联任务的Google ID
     * @return 关联GID，可能为null
     */
    public String getRelatedGid() {
        return mRelatedGid;
    }

    /**
     * 判断是否值得保存
     * @return notes字段不为空时返回true
     */
    @Override
    public boolean isWorthSaving() {
        return getNotes() != null;
    }

    /**
     * 从远程JSON数据设置内容
     * @param js 包含远程数据的JSON对象
     */
    @Override
    public void setContentByRemoteJSON(JSONObject js) {
        // 先调用父类方法处理基础字段
        super.setContentByRemoteJSON(js);

        // 如果notes字段不为空，解析其中的GID
        if (getNotes() != null) {
            try {
                // 将notes字符串转为JSON对象
                JSONObject metaInfo = new JSONObject(getNotes().trim());
                // 从JSON中获取关联GID
                mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
            } catch (JSONException e) {
                Log.w(TAG, "failed to get related gid"); // 记录警告日志
                mRelatedGid = null; // 解析失败时重置GID
            }
        }
    }

    /**
     * 从本地JSON设置内容（不支持）
     * @param js JSON对象
     * @throws IllegalAccessError 总是抛出此异常
     */
    @Override
    public void setContentByLocalJSON(JSONObject js) {
        // 元数据不应从本地JSON设置，直接抛出异常
        throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
    }

    /**
     * 获取本地JSON内容（不支持）
     * @throws IllegalAccessError 总是抛出此异常
     */
    @Override
    public JSONObject getLocalJSONFromContent() {
        // 元数据不应生成本地JSON，直接抛出异常
        throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
    }

    /**
     * 获取同步动作（不支持）
     * @param c 数据库Cursor
     * @throws IllegalAccessError 总是抛出此异常
     */
    @Override
    public int getSyncAction(Cursor c) {
        // 元数据不支持同步动作查询，直接抛出异常
        throw new IllegalAccessError("MetaData:getSyncAction should not be called");
    }
}