package jp.agentec.abook.abv.bl.logic;

import java.io.IOException;
import java.util.Map;

import jp.agentec.abook.abv.bl.acms.client.AcmsClient;
import jp.agentec.abook.abv.bl.acms.client.json.MasterDataJSON;
import jp.agentec.abook.abv.bl.acms.client.parameters.FetchDateParameters;
import jp.agentec.abook.abv.bl.common.ABVEnvironment;
import jp.agentec.abook.abv.bl.common.exception.ABVException;
import jp.agentec.abook.abv.bl.common.exception.ABVExceptionCode;
import jp.agentec.abook.abv.bl.common.exception.AcmsException;
import jp.agentec.abook.abv.bl.common.exception.NetworkDisconnectedException;
import jp.agentec.abook.abv.bl.common.log.Logger;
import jp.agentec.adf.util.FileUtil;

public class MasterDataLogic extends AbstractLogic {
    private static final java.lang.String TAG = "MasterDataLogic";

	/**
	 * グループ情報をサーバから受信し、ローカルに保存します。既存のデータは上書きされます。また、サーバにないグループがローカルにある場合、そのグループは削除されます。
     * マスタデータ情報をサーバから受信し、ローカルにJSONで保存する。で、
     * データ単位で項目はあるが要素が０件のデータは削除、
     * データ単位で項目が存在しないデータは変更無し
	 * @param lastFetchDate 最終実行日付
	 * @param retryCount 失敗カウント
	 * @throws ABVException　キャッシュにユーザ情報がありません。再度ログインする必要があります。
	 * @throws AcmsException 
	 * @throws Exception その他、例外です。
	 * @since 1.0.0
	 */
	/** HTTP のみ。refresh 時に operationGroupMaster 等と並列フェッチするために使用。 */
	public MasterDataJSON fetchMasterDataJson(String lastFetchDate, int retryCount) throws AcmsException, NetworkDisconnectedException {
		FetchDateParameters param = new FetchDateParameters(cache.getMemberInfo().sid, lastFetchDate);
		return AcmsClient.getInstance(cache.getUrlPath(), networkAdapter).masterData(param, retryCount);
	}

	/** {@link #fetchMasterDataJson} の結果をローカル JSON ファイルへ反映し、fetchDate を返す。 */
	public String applyMasterDataJson(MasterDataJSON masterDataJson) throws IOException {
		Map<String, String> masterDataMap = masterDataJson.masterDataMap;
		if (masterDataMap != null) {
			for (Map.Entry<String, String> entry : masterDataMap.entrySet()) {
				Logger.d(TAG, "masterData key=" + entry.getKey());
				try {
					createMasterDataJson(entry.getKey(), entry.getValue());
				} catch (IOException e) {
					Logger.e(TAG, "masterDataJSON error : ", e);
					throw e;
				}
			}
		}
		return masterDataJson.fetchDate;
	}

	public String initializeMasterData(String lastFetchDate, int retryCount) throws AcmsException, NetworkDisconnectedException, IOException {
		try {
			return applyMasterDataJson(fetchMasterDataJson(lastFetchDate, retryCount));
		} catch (Exception e) {
			Logger.e(TAG, "masterDataSend error : ", e);
			throw e;
		}
	}

	/**
	 * content.jsonファイル作成
	 *
	 * @param jsonKeyData
	 * @param jsonValueData
	 * @throws IOException
	 */
	private void createMasterDataJson(String jsonKeyData, String jsonValueData) throws IOException {
		// マスタデータの保存されるパース
		String masterDataJsonPath = ABVEnvironment.getInstance().getMasterFilePath() + "/" + jsonKeyData + ".json";
		if (jsonValueData.contains(",")) {
			// マスタデータのJSONのパース設定
			FileUtil.createFile(masterDataJsonPath, jsonValueData);
		} else {
			// データ単位で項目はあるが要素が０件のデータは削除
			FileUtil.deleteFileOnly(masterDataJsonPath);
		}
	}

}
