/**
  * @ProiectName:MiNote
  * @Package:    gtask.remote
  * @ClassName:  GTaskASyncTask
  * @Description:GTaskASyncTask类是一个异步任务类，用于执行后台任务并在UI线程更新相关的UI组件。
  * 其功能包括1.后台任务的执行：例如从服务器获取数据、执行文件读写操作等。这些任务将在后台线程中执行，避免在UI线程中执行耗时操作而阻塞UI响应。
  * 2.进度更新和反馈：在任务执行过程中，GTaskASyncTask类可以通过调用publishProgress()方法更新任务的进度，
  * 并且在UI线程中回调onProgressUpdate()方法，以便更新相关的UI组件
  * 3.结果返回和处理：当任务执行完成后，GTaskASyncTask类会将执行结果返回给UI线程，并在UI线程中回调onPostExecute()方法。
  * 在该方法中，可以根据任务执行结果更新UI组件、执行其他操作或显示提示信息。
  * @Author:     wmq
*/

package net.micode.notes.gtask.remote;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;

import net.micode.notes.R;
import net.micode.notes.ui.NotesListActivity;
import net.micode.notes.ui.NotesPreferenceActivity;

/**
 * @功能名: 定义名为GTaskASyncTask的类，并声明了一些成员变量和内部接口
 * @参数 :
 * mContext：上下文对象，用于获取系统服务。
 * mNotifiManager：通知管理器，用于发送通知。
 * mTaskManager：GTaskManager的实例，用于管理任务。
 * mOnCompleteListener：任务完成的回调接口。
 * @功能描述:通过在GTaskASyncTask类中声明这些成员变量和内部接口，
 * 可以在异步任务的执行过程中使用上下文、通知管理器和任务管理器等资源，
 * 并在任务完成时回调通知调用者。这样可以更好地管理和控制异步任务的执行，并提供灵活的任务完成回调机制。
 * @实现过程:
 * @Author: wmq
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {//执行的任务可以接收Void类型的输入参数，发布String类型的进度信息，最终返回Integer类型的结果。

    private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;//静态变量，用于标识通知的ID。通常用于发送通知时唯一标识通知的标识符。

    public interface OnCompleteListener {//内部接口，定义了一个回调方法onComplete()。当任务完成时，可以通过实现该接口，在任务完成时进行回调通知。
        void onComplete();
    }

    private Context mContext;

    private NotificationManager mNotifiManager;

    private GTaskManager mTaskManager;

    private OnCompleteListener mOnCompleteListener;

/**
 * @功能名:  GTaskASyncTask
 * @参数 : context/listener
 * @功能描述: 是本类的构造函数，)接收一个上下文对象作为参数，并在构造函数内部进行了一些初始化操作
 * @实现过程: 见每一行后面
 * @Author: wmq
*/
    public GTaskASyncTask(Context context, OnCompleteListener listener) {
        mContext = context; //将传入的OnCompleteListener接口的实例赋值给成员变量mOnCompleteListener。用于在任务完成时回调通知调用者。
        mOnCompleteListener = listener;
        mNotifiManager = (NotificationManager) mContext
                .getSystemService(Context.NOTIFICATION_SERVICE);//通过上下文对象获取通知管理器的实例。该通知管理器用于发送通知。
        mTaskManager = GTaskManager.getInstance();//：通过调用GTaskManager类的静态方法getInstance()获取GTaskManager的单例实例。mTaskManager用于管理任务的执行。
    }
/**
 * @功能名: cancelSync()
 * @参数 :
 * @功能描述: 取消正在进行的同步任务
 * @实现过程: 通过调用mTaskManager的cancelSync()方法来取消同步任务
 * 某些情况下，用户需要停止或取消当前正在执行的任务，例如用户手动取消了同步操作或者发生了异常情况需要终止任务
 * @Author: wmq
*/

    public void cancelSync() {
        mTaskManager.cancelSync();
    }
/**
 * @功能名: publishProgess
 * @参数 :message
 * @功能描述: 用于发布任务执行的进度信息,在异步任务的执行过程中，有时需要将一些进度信息反馈给用户，
 * 可以通过调用publishProgress()方法来实现。该方法会在UI线程调用onProgressUpdate()方法，从而更
 * 新UI界面上的进度信息。
 * @实现过程: publishProgess方法重载了AsyncTask类中的publishProgress()方法，
 * 并将传入的message作为进度信息进行发布。这样，外部调用者就可以通过调用GTaskASyncTask
 * 对象的publishProgess()方法来发布任务的执行进度信息，从而实现任务进度的实时反馈。
 * @Author: wmq
*/
    public void publishProgess(String message) {// 发布进度单位，系统将会调用onProgressUpdate()方法更新这些值
        publishProgress(new String[] {
            message
        });
    }

  /*  private void showNotification(int tickerId, String content) {
        Notification notification = new Notification(R.drawable.notification, mContext
                .getString(tickerId), System.currentTimeMillis());
        notification.defaults = Notification.DEFAULT_LIGHTS;
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        PendingIntent pendingIntent;
        if (tickerId != R.string.ticker_success) {
            pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
                    NotesPreferenceActivity.class), 0);

        } else {
            pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
                    NotesListActivity.class), 0);
        }
        //notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
        //       pendingIntent);
        notification.contentIntent = pendingIntent;
        mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
    }*/
    /**
     * @功能名: showNotification
     * @参数  :int tickerId / String content
     * @功能描述:
     * 根据传入的tickerId参数判断通知的类型：
     * 使用Notification.Builder类来构建通知：
     * 通过调用builder.getNotification()方法获取构建的通知对象；
     * 最后使用mNotifiManager.notify()方法发送通知
     * @实现过程: 如果tickerId不等于R.string.ticker_success（即不是成功的通知），则创建一个将跳转到
     * NotesPreferenceActivity类的PendingIntent对象。如果tickerId等于R.string.ticker_success
     * （即成功的通知），则创建一个将跳转到NotesListActivity类的PendingIntent对象。
     * @Author: wmq
    */
    private void showNotification(int tickerId, String content) {

      PendingIntent pendingIntent;

      if (tickerId != R.string.ticker_success) {

          pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,

                  NotesPreferenceActivity.class), 0);

      } else {

          pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,

                  NotesListActivity.class), 0);

      }

      Notification.Builder builder = new Notification.Builder(mContext)

              .setAutoCancel(true) //设置通知点击后自动取消

              .setContentTitle(mContext.getString(R.string.app_name))//设置通知的标题为应用名称。

              .setContentText(content)//设置通知的内容为传入的content参数。

              .setContentIntent(pendingIntent)//设置通知点击时的跳转意图为之前创建的PendingIntent对象。

              .setWhen(System.currentTimeMillis())//时间设置

              .setOngoing(true);//用户无法手动清除

      Notification notification=builder.getNotification();

      mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//将通知显示在系统通知栏中。其中GTASK_SYNC_NOTIFICATION_ID作为通知的ID，可以用于标识该通知。

  }

  /**
   * @功能名: doInBackground
   * @参数 : unused
   * @功能描述: 用于在后台执行耗时操作，如网络请求、数据库查询等任务。
   * @实现过程: @Override注解表示该方法是对父类（AsyncTask）中的方法进行重写
   *在执行过程中可以调用publishProgress()方法来更新异步任务的执行进度。
   *最后返回同步操作的结果，通常是一个代表同步状态的整数值。
   * @Author: wmq
  */
    @Override
    protected void onProgressUpdate(String... progress) {
        showNotification(R.string.ticker_syncing, progress[0]);
        if (mContext instanceof GTaskSyncService) {
            ((GTaskSyncService) mContext).sendBroadcast(progress[0]);
        }
    }

    /**
     * @功能名: onPostExecute
     * @参数 : result
     * @功能描述: 用于在后台操作完成后执行一些操作，通常是更新UI界面或者执行回调函数。
     * @实现过程: 利用result进行不同状态的判断，并执行相应的方法，具体在下面标注
     * @Author: wmq
    */
    @Override //表示该方法是对父类（AsyncTask）中的方法进行重写
    protected void onPostExecute(Integer result) {      //这表示该方法接收一个Integer类型的参数result，表示后台操作的结果。
        if (result == GTaskManager.STATE_SUCCESS) {     //表示同步操作成功，那么会显示一个通知，更新上次同步时间，并执行NotesPreferenceActivity.setLastSyncTime()方法保存最新的同步时间。
            showNotification(R.string.ticker_success, mContext.getString(
                    R.string.success_sync_account, mTaskManager.getSyncAccount()));
            NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
        } else if (result == GTaskManager.STATE_NETWORK_ERROR) {    //表示网络错误，会显示一个通知，提示同步时发生网络错误。
            showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));
        } else if (result == GTaskManager.STATE_INTERNAL_ERROR) {       //表示内部错误，会显示一个通知，提示同步时发生内部错误。如果result等于
            showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));
        } else if (result == GTaskManager.STATE_SYNC_CANCELLED) {       //表示同步被取消，会显示一个通知，提示同步被取消。
            showNotification(R.string.ticker_cancel, mContext
                    .getString(R.string.error_sync_cancelled));
        }
        if (mOnCompleteListener != null) {      //如果存在mOnCompleteListener回调函数对象，会在新的线程中执行mOnCompleteListener.onComplete()方法。
            new Thread(new Runnable() {

                public void run() {
                    mOnCompleteListener.onComplete();
                }
            }).start();
        }
    }
}
