package com.example.wordbook.task;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import android.util.TimingLogger;

import com.example.wordbook.common.Common;
import com.example.wordbook.common.Message;
import com.example.wordbook.provider.WBData;
import com.example.wordbook.provider.WBHelper;
import com.example.wordbook.provider.WBProvider;

/**
 * 単語帳DB問題集出力タスク
 */
public class AsyncTaskExport extends AsyncTaskBase {

	/** TAG */
	private static final String TAG = AsyncTaskExport.class.getSimpleName();

	/**
	 * コンストラクタ
	 * 
	 * @param activity
	 *            アクティビティ
	 * @param horizontal
	 *            水平進捗バー表示設定
	 */
	public AsyncTaskExport(Activity activity, boolean horizontal) {
		super(activity, horizontal);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#onPreExecute()
	 */
	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		Log.d(TAG, "onPreExecute()");
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
	 */
	@Override
	protected void onPostExecute(Integer result) {

		// 処理成功
		if (result > 0) {
			// 成功通知
			Message.show(mActivity, Message.ID.EXPORT_COMPLETE);
		} else {
			// 失敗通知
			Message.show(mActivity, Message.ID.EXPORT_FAILED);
		}

		Log.d(TAG, "onPostExecute()=" + result);
		super.onPostExecute(result);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see android.os.AsyncTask#doInBackground(Params[])
	 */
	@Override
	protected Integer doInBackground(String... params) {
		Log.d(TAG, "doInBackground()");
		int result = 0;

		// パラメータ取得
		String data = "";
		if (params == null || params.length == 0) {
			return result;
		}
		data = params[0];

		// インデックス取得
		int index = 0;
		// データ数取得
		int data_max = 0;
		List<Map<String, Object>> list = Common.getWordbookPrefList(mActivity
				.getApplicationContext());
		for (Map<String, Object> item : list) {
			if (item.get(Common.WORDBOOK_TITLE).equals(data)) {
				index = (Integer) item.get(Common.WORDBOOK_INDEX);
				data_max = (Integer) item.get(Common.WORDBOOK_COUNT);
				break;
			}
		}
		if (index == 0) {
			return result;
		}
		if (data_max == 0) {
			return result;
		}

		// Indexの問題集出力
		final int DB_MODE = 1;
		TimingLogger logger = new TimingLogger("dbg", "Export()");

		// 出力ファイルパス
		final String path = Common.WORDBOOK_DIRECTORY + data
				+ Common.WORDBOOK_OUT_SUFFIX + Common.WORDBOOK_EXT;
		// 対象設定
		String selection = WBData.InfoColumns.INFO_FILE + "=?";
		String[] selectionArgs = { Integer.toString(index) };
		Cursor c;
		int idx_level, idx_flag, idx_ok, idx_ng, idx_q, idx_a, idx_d1, idx_d2;

		FileOutputStream fos = null;
		OutputStreamWriter osw = null;
		PrintWriter pw = null;
		try {
			fos = new FileOutputStream(path);
			osw = new OutputStreamWriter(fos, "UTF-8");
			pw = new PrintWriter(osw);

			// プログレスバー設定
			final int STEP = 20;
			int data_step = data_max / STEP;
			publishProgress(0, data_max);

			switch (DB_MODE) {
			case 0:
				// by ContentProvider
				ContentResolver cr = mActivity.getContentResolver();
				Uri uri = WBProvider.INFO_CONTENT_URI;
				c = cr.query(uri, null, selection, selectionArgs, null);
				idx_level = c.getColumnIndex(WBData.InfoColumns.INFO_LEVEL);
				idx_flag = c.getColumnIndex(WBData.InfoColumns.INFO_FLAG);
				idx_ok = c.getColumnIndex(WBData.InfoColumns.INFO_OK);
				idx_ng = c.getColumnIndex(WBData.InfoColumns.INFO_NG);
				idx_q = c.getColumnIndex(WBData.InfoColumns.INFO_QUESTION);
				idx_a = c.getColumnIndex(WBData.InfoColumns.INFO_ANSWER);
				idx_d1 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA1);
				idx_d2 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA2);
				while (c.moveToNext()) {
					pw.println(getExportString(c, idx_level, idx_flag, idx_ok,
							idx_ng, idx_q, idx_a, idx_d1, idx_d2));
					// プログレスバー更新
					if (++result >= data_step) {
						publishProgress(result);
						data_step += data_max / STEP;
					}
				}
				c.close();
				logger.addSplit("ContentProvider");
				break;
			default:
				// by SQLiteOpenHelper
				WBHelper helper = WBHelper.getInstance(mActivity);
				SQLiteDatabase db = helper.getReadableDatabase();
				c = db.query(WBData.TABLE_NAME_INFO, null, selection,
						selectionArgs, null, null, null);
				idx_level = c.getColumnIndex(WBData.InfoColumns.INFO_LEVEL);
				idx_flag = c.getColumnIndex(WBData.InfoColumns.INFO_FLAG);
				idx_ok = c.getColumnIndex(WBData.InfoColumns.INFO_OK);
				idx_ng = c.getColumnIndex(WBData.InfoColumns.INFO_NG);
				idx_q = c.getColumnIndex(WBData.InfoColumns.INFO_QUESTION);
				idx_a = c.getColumnIndex(WBData.InfoColumns.INFO_ANSWER);
				idx_d1 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA1);
				idx_d2 = c.getColumnIndex(WBData.InfoColumns.INFO_DATA2);
				while (c.moveToNext()) {
					pw.println(getExportString(c, idx_level, idx_flag, idx_ok,
							idx_ng, idx_q, idx_a, idx_d1, idx_d2));
					// プログレスバー更新
					if (++result >= data_step) {
						publishProgress(result);
						data_step += data_max / STEP;
					}
				}
				c.close();
				db.close();
				helper.close();
				logger.addSplit("SQLiteOpenHelper");
				break;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} finally {
			try {
				if (pw != null) {
					pw.close();
				}
				if (osw != null) {
					osw.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		// 処理時間計測
		logger.dumpToLog();

		return result;
	}

	/**
	 * 出力用文字列生成
	 * 
	 * @param c
	 *            解析対象カーソル
	 * @param idx_level
	 *            ColumnIndex:Level用
	 * @param idx_flag
	 *            ColumnIndex:Flag用
	 * @param idx_ok
	 *            ColumnIndex:OK用
	 * @param idx_ng
	 *            ColumnIndex:NG用
	 * @param idx_q
	 *            ColumnIndex:Question用
	 * @param idx_a
	 *            ColumnIndex:Answer用
	 * @param idx_d1
	 *            ColumnIndex:Data1用
	 * @param idx_d2
	 *            ColumnIndex:Data2用
	 * @return 出力用文字列
	 */
	private String getExportString(Cursor c, int idx_level, int idx_flag,
			int idx_ok, int idx_ng, int idx_q, int idx_a, int idx_d1, int idx_d2) {

		// CSV形式
		StringBuilder sb = new StringBuilder();
		sb.append(Integer.toString(c.getInt(idx_level)));
		sb.append(",");
		sb.append(Integer.toString(c.getInt(idx_flag)));
		sb.append(",");
		sb.append(Integer.toString(c.getInt(idx_ok)));
		sb.append(",");
		sb.append(Integer.toString(c.getInt(idx_ng)));
		sb.append(",");
		sb.append(c.getString(idx_q));
		sb.append(",");
		sb.append(c.getString(idx_a));
		sb.append(",");
		sb.append(c.getString(idx_d1));
		sb.append(",");
		sb.append(c.getString(idx_d2));

		return sb.toString();
	}

}
