/*
 * 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.
 */
//定义该类所在的包。包是 Java 中组织类的方式，有助于代码的组织和管理。
package net.micode.notes.gtask.data;
//导入 Android 的 Cursor 类，Cursor 是用于访问和操作数据库查询结果的工具。
import android.database.Cursor;
//导入 Android 的 Log 类，用于在代码中输出日志信息。
import android.util.Log;

//导入一个自定义的工具类 GTaskStringUtils，它包含与 Google Tasks 相关的常量和方法。
import net.micode.notes.tool.GTaskStringUtils;

//导入 JSON 处理类。JSONObject 用于创建和解析 JSON 数据，JSONException 用于捕获解析 JSON 时的错误。
import org.json.JSONException;
import org.json.JSONObject;



//定义一个公共类 MetaData，该类继承自 Task 类，表示与 Google 任务相关的元数据（例如任务的 gid）。
public class MetaData extends Task {
    
    //定义一个 TAG 字符串常量，存储当前类的简短类名 "MetaData"，用于在日志中输出调试信息。
    private final static String TAG = MetaData.class.getSimpleName();

    
    //声明一个私有成员变量 mRelatedGid，用于保存与任务相关的 Google 任务 ID（gid）。初始值为 null。
    private String mRelatedGid = null;


//    定义一个公共方法 setMeta，用于设置任务的元数据。接收两个参数：
//    gid：一个字符串，表示任务的 Google ID。
//    metaInfo：一个 JSONObject，包含其他元数据（如任务的附加信息）。
    public void setMeta(String gid, JSONObject metaInfo) {

//        尝试将传入的 gid 插入到 metaInfo 中。GTaskStringUtils.META_HEAD_GTASK_ID 是用于存储任务 ID 的常量。
//        如果插入失败，捕获 JSONException 异常并打印错误日志。
        try {
            metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
        } catch (JSONException e) {
            Log.e(TAG, "failed to put related gid");
        }
        //将 metaInfo 转换为字符串并调用 setNotes() 方法保存。这将任务的元数据作为字符串保存在任务的 notes 字段中。
        setNotes(metaInfo.toString());
        //调用 setName() 设置任务的名称为 GTaskStringUtils.META_NOTE_NAME。这个名称可能是一个预定义的常量，表示任务的默认名称。
        setName(GTaskStringUtils.META_NOTE_NAME);
    }


    //定义一个公共方法 getRelatedGid，用于获取与任务相关的 Google 任务 ID。
    // return mRelatedGid;：返回之前保存的 mRelatedGid。
    public String getRelatedGid() {
        return mRelatedGid;
    }

    
    
    //@Override：表示该方法是重写父类 Task 中的方法。
    //public boolean isWorthSaving()：定义一个方法 isWorthSaving，用于判断当前任务是否值得保存。通常，它会根据某些条件来判断任务是否需要被同步或保存到数据库中。
    //return getNotes() != null;：判断任务的 notes 字段是否为 null。如果 notes 字段不为空，说明任务有有效内容，返回 true；否则返回 false。
    @Override
    public boolean isWorthSaving() {
        return getNotes() != null;
    }
    @Override
    //定义方法 setContentByRemoteJSON，用于从远程获取 JSON 数据并设置任务内容。
    public void setContentByRemoteJSON(JSONObject js) {
        //调用父类的同名方法来处理远程 JSON 数据的基本设置。
        super.setContentByRemoteJSON(js);
        //检查任务的 notes 字段是否不为空。
        if (getNotes() != null) {
            //如果 notes 不为空，尝试将其转换为 JSONObject。
            //然后，从中提取出 gid 并保存到 mRelatedGid 中。
            // 如果解析过程中出现错误（例如格式问题),会捕获 JSONException 并输出警告日志，同时将 mRelatedGid 设为 null。
            try {
                JSONObject metaInfo = new JSONObject(getNotes().trim());
                mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
            } catch (JSONException e) {
                Log.w(TAG, "failed to get related gid");
                mRelatedGid = null;
            }
        }
    }

    
    //@Override：
    //public void setContentByLocalJSON(JSONObject js)：
    //throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");：
    @Override
    //该方法定义了从本地 JSON 数据设置任务内容的行为。
    public void setContentByLocalJSON(JSONObject js) {
        // this function should not be called
        //该方法被设计为不可调用，如果被调用，抛出 IllegalAccessError 异常。
        // 该类不允许使用本地 JSON 数据设置任务内容，因此抛出异常来提醒开发者
        throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
    }



    //表示重写父类的方法。
    @Override
    //该方法定义了获取本地 JSON 数据的行为。
    public JSONObject getLocalJSONFromContent() {
        //与 setContentByLocalJSON 类似，该方法不应该被调用，如果被调用，抛出 IllegalAccessError 异常.
        throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
    }




//表示重写父类的方法。
    @Override
    //定义获取同步操作的方法，通常会返回一个与同步操作相关的标志值。
    public int getSyncAction(Cursor c) {
        //该方法不应被调用，抛出 IllegalAccessError 异常。
        throw new IllegalAccessError("MetaData:getSyncAction should not be called");
    }

}
