/*
 * 版权所有 (c) 2010-2011，MiCode 开源社区 (www.micode.net)
 * 根据 Apache 许可证 2.0 版本（"许可证"）授权；
 * 除非符合许可证的规定，否则不得使用本文件。
 * 您可以从以下网址获取许可证副本：
 * http://www.apache.org/licenses/LICENSE-2.0
 * 除非适用法律要求或书面同意，本软件按"原样"分发，
 * 没有任何明示或暗示的保证或条件。
 * 详见许可证中规定的权限和限制。
 * （注：这是一份标准的Apache许可证2.0版本的开源声明）
 */
// 声明Google任务同步服务类，继承自Service
package net.micode.notes.gtask.remote;
// 导入安卓活动(Activity)相关类
// 提供用户交互界面的基础组件，代表一个应用屏幕
import android.app.Activity;
// 导入安卓服务(Service)相关类
// 后台运行组件，无用户界面，用于执行长时间操作
import android.app.Service;
// 导入上下文(Context)相关类
// 提供应用环境全局信息，是访问应用资源的入口
import android.content.Context;
// 导入意图(Intent)相关类
// 用于组件间通信的消息对象，可包含操作指令和数据
import android.content.Intent;
// 导入Bundle数据包相关类
// 键值对集合，用于在不同组件间传递数据
import android.os.Bundle;
// 导入绑定接口(IBinder)相关类
// 跨进程通信(IPC)的核心接口，用于Service与Activity绑定
import android.os.IBinder;

// Google任务同步后台服务
public class GTaskSyncService extends Service {
    // 同步动作的Intent键名
    public final static String ACTION_STRING_NAME = "sync_action_type";

    // 启动同步的动作值
    public final static int ACTION_START_SYNC = 0;

    // 取消同步的动作值
    public final static int ACTION_CANCEL_SYNC = 1;

    // 无效动作值
    public final static int ACTION_INVALID = 2;

    // 广播名称
    public final static String GTASK_SERVICE_BROADCAST_NAME =
            "net.micode.notes.gtask.remote.gtask_sync_service";

    // 广播键名：是否正在同步
    public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";

    // 广播键名：进度消息
    public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";

    // 同步任务实例
    private static GTaskASyncTask mSyncTask = null;

    // 同步进度文本
    private static String mSyncProgress = "";

    // 开始同步方法
    private void startSync() {
        if (mSyncTask == null) {  // 如果没有正在进行的同步任务
            // 创建新的异步任务实例
            mSyncTask = new GTaskASyncTask(this, () -> {
                // 同步完成后的回调
                mSyncTask = null;  // 清空任务引用
                sendBroadcast("");  // 发送空广播
                stopSelf();  // 停止服务
            });
            sendBroadcast("");  // 发送初始广播
            mSyncTask.execute();   // 执行异步任务
        }
    }

    // 取消同步方法
    private void cancelSync() {
        if (mSyncTask != null) {  // 如果存在同步任务
            mSyncTask.cancelSync();   // 调用取消方法
        }
    }

    // 服务创建时调用
    @Override
    public void onCreate() {
        mSyncTask = null;  // 初始化任务引用
    }

    // 服务启动命令处理
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Bundle bundle = intent.getExtras();   // 获取附加数据
        if (bundle != null && bundle.containsKey(ACTION_STRING_NAME))  {
            // 根据动作类型执行不同操作
            switch (bundle.getInt(ACTION_STRING_NAME,  ACTION_INVALID)) {
                case ACTION_START_SYNC:
                    startSync();  // 开始同步
                    break;
                case ACTION_CANCEL_SYNC:
                    cancelSync();  // 取消同步
                    break;
                default:
                    break;
            }
            return START_STICKY;  // 服务被终止后自动重启
        }
        return super.onStartCommand(intent,  flags, startId);
    }

    // 内存不足时调用
    @Override
    public void onLowMemory() {
        if (mSyncTask != null) {  // 如果正在同步
            mSyncTask.cancelSync();   // 取消当前同步
        }
    }

    // 绑定服务时调用(本服务不需要绑定)
    @Override
    public IBinder onBind(Intent intent) {
        return null;  // 返回null表示不支持绑定
    }

    // 发送广播方法
    public void sendBroadcast(String msg) {
        mSyncProgress = msg;  // 更新进度文本
        Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);  // 创建广播Intent
        // 添加是否正在同步的状态
        intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING,  mSyncTask != null);
        // 添加进度消息
        intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG,  msg);
        sendBroadcast(intent);  // 发送广播
    }

    // 静态方法：从Activity启动同步
    public static void startSync(Activity activity) {
        GTaskManager.getInstance().setActivityContext(activity);   // 设置活动上下文
        // 创建启动服务的Intent
        Intent intent = new Intent(activity, GTaskSyncService.class);
        // 设置动作为开始同步
        intent.putExtra(GTaskSyncService.ACTION_STRING_NAME,
                GTaskSyncService.ACTION_START_SYNC);
        activity.startService(intent);   // 启动服务
    }

    // 静态方法：取消同步
    public static void cancelSync(Context context) {
        // 创建取消同步的服务Intent
        Intent intent = new Intent(context, GTaskSyncService.class);
        // 设置动作为取消同步
        intent.putExtra(GTaskSyncService.ACTION_STRING_NAME,
                GTaskSyncService.ACTION_CANCEL_SYNC);
        context.startService(intent);   // 启动服务
    }

    // 静态方法：检查是否正在同步
    public static boolean isSyncing() {
        return mSyncTask != null;  // 通过任务实例判断
    }

    // 静态方法：获取当前进度文本
    public static String getProgressString() {
        return mSyncProgress;  // 返回进度消息
    }
}
