/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：CKA908SFLogic
*	ソースファイル名：CKA908SFLogic.java
*	作成者			：FJ)藤本
*	日付			：2018年03月09日
*＜機能概要＞
*   契約者情報変更(卸先事業者)(API)のビューロジックです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/03/09	FJ)藤本		【ANK-3366-00-00】eo光設備卸対応
*
**********************************************************************/
package eo.web.webview.CKA908SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

import com.fujitsu.futurity.model.common.check.EmsizeCharCheck;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JCKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.common.JKKApiCommon;
import eo.web.webview.common.JKKApiCommonUtil;
import eo.web.webview.mapping.CKSV0063_CKSV0063OPDBMapper;

/**
 * CKA908のビューロジックです。<p>
 * <BR>
 * @author FJ
 */
@SuppressWarnings("serial")
public class CKA908SFLogic extends JCCWebBusinessLogic
{
	/** 契約者情報変更(卸先事業者)のサービスID */
	private static final Object SERVICE_ID_CKIFE050 = JKKStrConst.SERVICE_ID_WSALE031;

	/**
	 * 契約者情報変更(卸先事業者)処理です。
	 * <br>
	 * @return 処理の成否
	 * @throws Exception エラーが発生した場合
	 */
	public boolean init() throws Exception
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;

		// リクエストパラメータ(JSONデータ)
		Map<String, Object> requestMap = null;

		// JSON形式のレスポンスデータ
		String jsonResponse = "";

		try
		{
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();

			// JSONデータ取得
			requestMap = JKKApiCommon.getJsonDataFromOrs(getSessionId());

			X31SDataBeanAccess commonBean = super.getCommonInfoBean();

			// 業務規制チェック
			if (!JKKApiCommon.checkRequestRestriction(commonBean))
			{
				// 規制中の場合
				DEBUG_LOG.debug("■業務規制エラー");

				// 処理応答電文(エラー)を取得
				jsonResponse = JKKApiCommon.createJsonResponse(requestMap,
						JKKStrConst.RETURN_CD_8000, JKKStrConst.RETURN_MESSAGE_SYSTEM_TIME_OUT).toString();
				// 応答電文に設定
				bean.sendMessageString(CKA908SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, JKKApiCommon.getResponseMsg(jsonResponse));
				return true;
			}

			// パラメータチェック
			jsonResponse = checkParameter(requestMap);
			if (!JKKApiCommon.isNull(jsonResponse))
			{
				// 応答電文に設定
				bean.sendMessageString(CKA908SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, JKKApiCommon.getResponseMsg(jsonResponse));
				return true;
			}

			// サービス呼び出し準備
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CKSV0063");
			HashMap<String, HashMap<String, Object>> inputMap = new HashMap<String, HashMap<String, Object>>();
			HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();
			CKSV0063_CKSV0063OPDBMapper mapper = new CKSV0063_CKSV0063OPDBMapper();
			// 上りマッピング
			mapper.setCKSV006301CC(requestMap, inputMap, JPCModelConstant.FUNC_CD_1);
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
			// 下りマッピング
			Map<String, Object> responseMap = new HashMap<String, Object>();
			mapper.getCKSV006301CC(responseMap, outputMap);

			// 共通項目を設定したJSONオブジェクトを生成する
			JSONObject jsonResObj = JKKApiCommon.createJsonResponse(requestMap,
					(String)responseMap.get("returnCode"), (String)responseMap.get("returnMessage"));

			// 個別項目設定
			if (JKKStrConst.CHECK_OK.equals((String)responseMap.get("returnCode")))
			{
				jsonResObj.put("commonKey", JKKApiCommon.getJsonValue(requestMap.get("commonKey")));
			}

			jsonResponse = jsonResObj.toString();
		}
		catch (Exception e)
		{
			DEBUG_LOG.debug("■致命的なエラー発生");

			// 例外トレースのログ出力
			JKKApiCommon.printDebugLog(e);

			// 処理応答電文(エラー)を取得
			jsonResponse = JKKApiCommon.createJsonResponse(requestMap,
					JKKStrConst.RETURN_CD_9000, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR).toString();
		}

		// 応答電文に設定
		bean.sendMessageString(CKA908SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, JKKApiCommon.getResponseMsg(jsonResponse));

		return true;
	}

	/**
	 * パラメータチェックを行います。
	 * <br>
	 * @param requestMap リクエストパラメータ(JSONデータ)
	 * @return 処理を終了する場合は処理応答電文、処理を継続する場合は空文字
	 * @throws JSONException JSON処理でエラーが発生した場合
	 */
	private String checkParameter(Map<String, Object> requestMap) throws JSONException
	{
		// 処理応答電文
		String jsonResponse = "";
		// リターンコード
		String returnCode = "";
		// リターンメッセージ
		String returnMessage = "";

		// コード値不整合チェック
		// サービスID
		if (!SERVICE_ID_CKIFE050.equals((String)requestMap.get("serviceID")))
		{
			returnCode = JKKStrConst.RETURN_CD_1000;
			returnMessage = JKKStrConst.RETURN_MESSAGE_SERVICEID_CHECK_ERROR;
		}
		// 性別
		else if (!JKKApiCommon.isNull(((String)requestMap.get("gender"))))
		{
			if (!Arrays.asList(JCKStrConst.CD00245_SEX_CD_MAN, JCKStrConst.CD00245_SEX_CD_WOMAN, JCKStrConst.CD00245_SEX_CD_OTHER)
					.contains((String)requestMap.get("gender")))
			{
				returnCode = JKKStrConst.RETURN_CD_1000;
				returnMessage = "「性別」コード値不整合チェックエラー";
			}
		}

		// カナ項目内部属性チェック
		if (JKKApiCommon.isNull(returnCode))
		{
			// 氏名（カナ）
			String nameKana = (String)requestMap.get("nameKana");
			if (!JKKApiCommon.isNull(nameKana))
			{
				if (!EmsizeCharCheck.isEmsizeEnNumKanaCheck(nameKana))
				{
					returnCode = "1001";
					returnMessage = "「氏名（カナ）」内部属性チェックエラー";
				}
			}
		}

		// 条件付き必須入力チェック
		if (JKKApiCommon.isNull(returnCode))
		{
			// 契約者住所項目のキーすべてが存在するかどうか
			boolean isAll = true;
			// 契約者住所項目のキーすべてが存在しないかどうか
			boolean isNothing = false;

			// 契約者住所項目(郵便番号〜部屋番号)におけるキーの有無を取得
			boolean[] containsKeys = {
					requestMap.containsKey("contractorAddressZipcode"), requestMap.containsKey("contractorAddress1"),
					requestMap.containsKey("contractorAddress2"), requestMap.containsKey("contractorAddress3"),
					requestMap.containsKey("contractorAddress4"), requestMap.containsKey("contractorAddress5"),
					requestMap.containsKey("contractorAddress6"), requestMap.containsKey("contractorAddress7")
					};

			for (boolean bool : containsKeys)
			{
				isAll &= bool;
				isNothing |= bool;
			}
			isNothing = !isNothing;

			// 契約者住所項目のキーが一部のみ存在している場合
			if (!isAll && !isNothing)
			{
				returnCode = "1050";
				returnMessage = "「契約者住所」条件付き必須チェックエラー";
			}
			// 契約者住所が設定されていて、契約者住所_郵便番号の値が未設定の場合
			else if (isAll && JKKApiCommon.isNull(((String)requestMap.get("contractorAddressZipcode"))))
			{
				returnCode = "1051";
				returnMessage = "「郵便番号」条件付き必須チェックエラー";
			}
			// 契約者住所が設定されていて、契約者住所_都道府県名〜契約者住所_部屋番号の値が未設定の場合
			else if (isAll
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress1")))
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress2")))
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress3")))
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress4")))
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress5")))
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress6")))
					&& JKKApiCommon.isNull(((String)requestMap.get("contractorAddress7"))))
			{
				returnCode = "1052";
				returnMessage = "「契約者住所」条件付き必須チェックエラー";
			}
			// 氏名
			else if (requestMap.containsKey("name") && JKKApiCommon.isNull(((String)requestMap.get("name"))))
			{
				returnCode = "1053";
				returnMessage = "「氏名」条件付き必須チェックエラー";
			}
			// 氏名（カナ）
			else if (requestMap.containsKey("nameKana") && JKKApiCommon.isNull(((String)requestMap.get("nameKana"))))
			{
				returnCode = "1054";
				returnMessage = "「氏名（カナ）」条件付き必須チェックエラー";
			}
			// 生年月日
			else if (requestMap.containsKey("birthday") && JKKApiCommon.isNull(((String)requestMap.get("birthday"))))
			{
				returnCode = "1055";
				returnMessage = "「生年月日」条件付き必須チェックエラー";
			}
			// 性別
			else if (requestMap.containsKey("gender") && JKKApiCommon.isNull(((String)requestMap.get("gender"))))
			{
				returnCode = "1056";
				returnMessage = "「性別」条件付き必須チェックエラー";
			}
			// 契約者電話番号
			else if (requestMap.containsKey("contractorPhoneNum") && JKKApiCommon.isNull(((String)requestMap.get("contractorPhoneNum"))))
			{
				returnCode = "1057";
				returnMessage = "「契約者電話番号」条件付き必須チェックエラー";
			}
		}

		// 変更項目存在チェック ※共通項目と共通キーの必須チェックはそとれんで実施済み
		if (JKKApiCommon.isNull(returnCode))
		{
			if (requestMap.size() == JKKApiCommonUtil.COMMON_HEADER_JSON.length + 1)
			{
				// 処理終了
				returnCode = JKKStrConst.CHECK_OK;
				returnMessage = null;
			}
		}

		if (!JKKApiCommon.isNull(returnCode))
		{
			// 共通項目を設定したJSONオブジェクトを生成する
			JSONObject jsonResObj = JKKApiCommon.createJsonResponse(requestMap, returnCode, returnMessage);
			if (JKKStrConst.CHECK_OK.equals(returnCode))
			{
				jsonResObj.put("commonKey", JKKApiCommon.getJsonValue(requestMap.get("commonKey")));
			}
			jsonResponse = jsonResObj.toString();
		}

		return jsonResponse;
	}
}
