package com.example.wordbook.task;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;

import com.example.wordbook.R;

/**
 * 非同期タスクベースクラス
 */
public abstract class AsyncTaskBase extends AsyncTask<String, Integer, Integer> {

	/** TAG */
	private static final String TAG = AsyncTaskBase.class.getSimpleName();

	/** アクティビティ */
	protected Activity mActivity = null;
	/** 進捗ダイアログ */
	protected ProgressDialog mDialog = null;
	/** 進捗バースタイル */
	protected boolean mHorizontal = false;
	/** 進捗バー最大値 */
	protected int mMax = 0;

	/**
	 * callback to let the activity know when the task has finished.
	 */
	public interface OnAsyncTaskFinished {
		/**
		 * Called when the task has finished.
		 */
		void onAsyncTaskFinished();
	}

	/**
	 * コンストラクタ
	 * 
	 * @param activity
	 *            アクティビティ
	 * @param horizontal
	 *            進捗バースタイル
	 */
	public AsyncTaskBase(Activity activity, boolean horizontal) {

		// 呼出元アクティビティ保存
		mActivity = activity;
		// 進捗バースタイル保存
		mHorizontal = horizontal;
	}

	/**
	 * 処理中ダイアログ表示
	 * 
	 * @param activity
	 *            アクティビティ
	 */
	public final void showDialog(Activity activity) {
		Log.d(TAG, "showDialog()");

		// 重複起動？
		if (mDialog != null) {
			Log.w(TAG, "showDialog() mProgressDialog!=null");
			return;
		}

		// 呼出元アクティビティ変更
		mActivity = activity;
		// 処理中ダイアログ生成
		mDialog = new ProgressDialog(mActivity);
		mDialog.setCancelable(false);
		mDialog.setMessage(mActivity.getString(R.string.label_processing));
		if (mHorizontal) {
			mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		}
		if (mMax > 0) {
			mDialog.setMax(mMax);
		}

		// 処理中ダイアログ表示
		mDialog.show();
	}

	/**
	 * 処理中ダイアログ除去
	 */
	public final void dismissDialog() {
		Log.d(TAG, "dismissDialog()");

		// 終了済み？
		if (mDialog == null) {
			Log.w(TAG, "dismissDialog() mProgressDialog==null");
			return;
		}

		// 処理中ダイアログ除去
		mDialog.dismiss();
		mDialog = null;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#onProgressUpdate(Progress[])
	 */
	@Override
	protected void onProgressUpdate(Integer... values) {
		super.onProgressUpdate(values);

		if (mDialog == null) {
			return;
		}
		if (values == null || values.length == 0) {
			return;
		}

		// 追加パラメータ
		if (values.length > 1) {
			// 進捗バー最大値保存
			mMax = values[1];
			// 最大値設定
			mDialog.setMax(values[1]);
		}
		// 現在値設定
		mDialog.setProgress(values[0]);

		Log.v(TAG, "onProgressUpdate()=" + values[0] + "/" + mMax);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#onCancelled()
	 */
	@Override
	protected void onCancelled() {
		super.onCancelled();
		Log.d(TAG, "onCancelled()");

		dismissDialog();
		mMax = 0;
		mHorizontal = false;
		mActivity = null;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#onPreExecute()
	 */
	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		Log.d(TAG, "onPreExecute()");

		showDialog(mActivity);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
	 */
	@Override
	protected void onPostExecute(Integer result) {

		dismissDialog();
		mMax = 0;
		mHorizontal = false;
		mActivity = null;

		Log.d(TAG, "onPostExecute()=" + result);
		super.onPostExecute(result);
	}

}
