/*
 * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * 您可以在遵守 License 的前提下使用本文件。
 * 您可以从以下地址获取 License 副本：
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 * 除非适用法律要求或书面同意，本软件根据 License 分发时“按现状”提供，
 * 不附带任何明示或暗示的保证或条件。请参阅 License 了解具体的权限和限制。
 */

package net.micode.notes.gtask.remote; // 指定代码所属的包名

import android.app.Activity; // 导入Activity类，用于获取上下文
import android.app.Service; // 导入Service类，用于创建后台服务
import android.content.Context; // 导入Context类，提供应用环境信息
import android.content.Intent; // 导入Intent类，用于组件间通信
import android.os.Bundle; // 导入Bundle类，用于传递数据
import android.os.IBinder; // 导入IBinder接口，用于服务间通信

/**
 * Google Tasks同步服务类，负责在后台执行任务同步操作
 * 通过Service机制实现，支持启动、取消同步等操作，并通过广播通知同步状态
 */
public class GTaskSyncService extends Service {
    // 同步动作类型的Extra键名
    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";

    // 广播中表示是否正在同步的Extra键名
    public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";

    // 广播中表示同步进度消息的Extra键名
    public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";

    // 静态变量，保存当前执行同步的异步任务实例
    private static GTaskASyncTask mSyncTask = null;

    // 静态变量，保存当前同步进度消息
    private static String mSyncProgress = "";

    /**
     * 启动Google Tasks同步操作
     * 检查是否已有同步任务在运行，若无则创建并执行新的同步任务
     */
    private void startSync() {
        if (mSyncTask == null) { // 检查是否已有同步任务在运行
            // 创建新的异步同步任务实例，传入服务上下文和完成监听器
            mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
                @Override
                public void onComplete() {
                    mSyncTask = null; // 同步完成后将任务实例置为null
                    sendBroadcast(""); // 发送同步完成的广播
                    stopSelf(); // 停止当前服务
                }
            });
            sendBroadcast(""); // 发送开始同步的广播
            mSyncTask.execute(); // 执行异步同步任务
        }
    }

    /**
     * 取消正在进行的同步操作
     * 如果有同步任务正在运行，则调用其取消方法
     */
    private void cancelSync() {
        if (mSyncTask != null) { // 检查是否有同步任务在运行
            mSyncTask.cancelSync(); // 调用任务的取消方法
        }
    }

    /**
     * 服务创建时调用的方法
     * 初始化服务状态，将同步任务实例置为null
     */
    @Override
    public void onCreate() {
        mSyncTask = null; // 确保服务创建时没有残留的同步任务
    }

    /**
     * 处理启动服务的命令
     * 根据Intent中携带的动作类型，执行相应的同步操作
     * @param intent 启动服务的Intent，可能包含同步动作类型
     * @param flags 启动标志
     * @param startId 启动ID
     * @return 服务启动模式，此处返回START_STICKY表示服务被终止后会自动重启
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Bundle bundle = intent.getExtras(); // 获取Intent携带的额外数据
        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; // 返回START_STICKY表示服务被终止后会自动重启
        }
        return super.onStartCommand(intent, flags, startId); // 处理默认情况
    }

    /**
     * 系统内存不足时调用的方法
     * 取消正在进行的同步任务，释放资源
     */
    @Override
    public void onLowMemory() {
        if (mSyncTask != null) { // 检查是否有同步任务在运行
            mSyncTask.cancelSync(); // 取消同步任务以释放资源
        }
    }

    /**
     * 绑定服务时调用的方法
     * 由于本服务不支持绑定，返回null
     * @param intent 绑定意图
     * @return null，表示不支持绑定
     */
    public IBinder onBind(Intent intent) {
        return null; // 本服务不支持绑定，返回null
    }

    /**
     * 发送同步状态广播
     * 将同步进度消息封装到Intent中并发送广播
     * @param msg 同步进度消息
     */
    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); // 发送广播
    }

    /**
     * 静态方法：启动Google Tasks同步服务
     * 从Activity上下文启动同步服务并传递启动同步的动作类型
     * @param activity 调用此方法的Activity，提供上下文
     */
    public static void startSync(Activity activity) {
        GTaskManager.getInstance().setActivityContext(activity); // 设置GTaskManager的Activity上下文
        Intent intent = new Intent(activity, GTaskSyncService.class); // 创建启动服务的Intent
        intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); // 添加启动同步的动作类型
        activity.startService(intent); // 启动服务
    }

    /**
     * 静态方法：取消Google Tasks同步服务
     * 从上下文启动服务并传递取消同步的动作类型
     * @param context 调用此方法的上下文
     */
    public static void cancelSync(Context context) {
        Intent intent = new Intent(context, GTaskSyncService.class); // 创建启动服务的Intent
        intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); // 添加取消同步的动作类型
        context.startService(intent); // 启动服务
    }

    /**
     * 静态方法：检查是否正在进行同步
     * @return true表示正在同步，false表示未同步
     */
    public static boolean isSyncing() {
        return mSyncTask != null; // 通过检查同步任务实例是否存在判断是否正在同步
    }

    /**
     * 静态方法：获取当前同步进度消息
     * @return 当前同步进度消息字符串
     */
    public static String getProgressString() {
        return mSyncProgress; // 返回当前同步进度消息
    }
}