/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCKSV903601CC.java
*   作成者          ：富士通
*   日付            ：2011年07月01日
*＜機能概要＞
*   PMPより連携された情報を基にメール受信設定を更新します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/28   FJ）関      新規作成
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.*;

import static eo.common.constant.JCKStrConst.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9036_CKSV9036OP_CKSV903601CC;
import com.fujitsu.futurity.bp.custom.constant.CKSV9036_CKSV9036OP_CKSV903601CC_mail_rcv_list;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.ICommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.ECK0011B060CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B120CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B120CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0141A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141B020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0141B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141C020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0141C030CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0141C040CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0201B030CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0201B030CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECKA9020001CBSMsg;

/**
 *  PMPより連携された情報を元にメール受信設定を更新する。
 * <BR>
 * @author 富士通
 */
public class JCKSV903601CC extends AbstractCommonComponent implements ICommonComponent
{

	/** 当CCの内部でしか使わないエラーコード */
	private static final String PMP_ERR_OTHER = "OTHER";

	/**
	 * メール受信設定更新メイン処理。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeMain(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		// 入力パラメータ取得
		Map inMap = (Map)param.getData(fixedText);
		String eoid = (String)inMap.get(CKSV9036_CKSV9036OP_CKSV903601CC.EOID);
		List<Map<String, String>> mailRcvList = (List<Map<String, String>>)inMap.get(CKSV9036_CKSV9036OP_CKSV903601CC.MAIL_RCV_LIST);

		// リターンコード初期化
		String returnCd = PMP_NORMAL_END;

		// 運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);

		/***************************************************/
		/** 内部で使用する変数の初期化                     */
		/***************************************************/
		String sysid = "";
		CAANMsg[] templateArray = null;
		String lastCustUpdDtm = null;
		String rrksMlad = null;
		//返却用最終更新年月日
		String lastCkUpdDtm = null;
		String lastKkUpdDtm = null;

		/***************************************************/
		/** マスター会員情報照会SC呼出                     */
		/***************************************************/
		Map result = callECK0011B060(handle, param, "1", null, eoid, null, null, null, null, null);

		if (isSuccess(result))
		{
			CAANMsg[] dataList = getResultMsgList(result, ECK0011B060CBSMsg.ECK0011B060CBSMSG1LIST);
			
			// 検索結果が0件の場合
			if ((dataList == null) || (dataList.length == 0))
			{
				returnCd = PMP_ERR_NODATA;  // データなし
			}
			// 検索結果が1件以上の場合
			else
			{
				sysid = getResultString(result, "ECK0011B060CBSMsg1List[0].sysid");
			}
		}
		else
		{
			returnCd = PMP_ERR_OTHER;  // その他のエラー
		}
		
		/***************************************************/
		/** PMP連携用排他制御                             **/
		/***************************************************/
		if (PMP_NORMAL_END.equals(returnCd))
		{
			result = callECKA9020001(handle, param, sysid, "1");
			if (isSuccess(result))
			{
				String errFlg = getResultString(result, ECKA9020001CBSMsg.LOCK_ERR_FLG);
				if (!"0".equals(errFlg))
				{
					returnCd = PMP_ERR_EXCLUSION;
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;
			}
		}
		
		/***************************************************/
		/** 最終更新日時取得                              **/
		/***************************************************/
		if (JCKBPCommon.inArray(returnCd, PMP_NORMAL_END, PMP_ERR_EXCLUSION))
		{
			result = callECK0011B120(handle, param, sysid);
			if (isSuccess(result))
			{
				String mapKeyPre = ECK0011B120CBSMsg.ECK0011B120CBSMSG1LIST + "[0].";
				String chkCkUpdDtm = getResultString(result, mapKeyPre + ECK0011B120CBSMsg1List.CK_UPD_DTM);
				String chkKkUpdDtm = getResultString(result, mapKeyPre + ECK0011B120CBSMsg1List.KK_UPD_DTM);
				lastCustUpdDtm = getResultString(result, mapKeyPre + ECK0011B120CBSMsg1List.CK_UPD_DTM);

				if(PMP_ERR_EXCLUSION.equals(returnCd))
				{
					if ((chkCkUpdDtm  != null) && (chkKkUpdDtm != null))
					{
						lastCkUpdDtm = chkCkUpdDtm;
						lastKkUpdDtm = chkKkUpdDtm;
						returnCd = PMP_ERR_EXCLUSION;
					}
					else
					{
						returnCd = PMP_ERR_NODATA;   // 該当データが存在しない場合はデータ無しエラー
					}
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}

		/***************************************************/
		/** 連絡先メールアドレスの取得             */
		/***************************************************/
		if (PMP_NORMAL_END.equals(returnCd))
		{
			result = callECK0201B030(handle, param, "2", sysid, null);
			if (isSuccess(result))
			{
				rrksMlad = getResultString(result, ECK0201B030CBSMsg.ECK0201B030CBSMSG1LIST + "[0]." + ECK0201B030CBSMsg1List.MLAD);
			}
			else
			{
				returnCd = PMP_ERR_OTHER; // その他エラー
			}
		}
		
		/***************************************************/
		/** オプトインメール受信設定一覧の取得             */
		/***************************************************/
		if (PMP_NORMAL_END.equals(returnCd))
		{
			result = callECK0141B020(handle, param, "4", sysid);
			if (isSuccess(result))
			{
				templateArray = getResultMsgList(result, ECK0141B020CBSMsg.ECK0141B020CBSMSG1LIST);
				// 検索結果が0件の場合
				if ((templateArray == null) || (templateArray.length == 0))
				{
					returnCd = PMP_ERR_NODATA;  // データなし
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER; // その他エラー
			}
		}

		/***************************************************/
		/** オプトインメール受信設定を更新                 */
		/***************************************************/
		if (PMP_NORMAL_END.equals(returnCd))
		{
			// 取得したオプトインメール受信設定一覧の件数分、更新する。
			for (CAANMsg optinmRcvSetRec : templateArray)
			{
				String optinmNo   = optinmRcvSetRec.getString(ECK0141B020CBSMsg1List.OPTINM_NO);			// オプトインメール番号
				String mlad       = optinmRcvSetRec.getString(ECK0141B020CBSMsg1List.MLAD);					//メールアドレス
				String svcKeiNo   = optinmRcvSetRec.getString(ECK0141B020CBSMsg1List.SVC_KEI_NO);			// サービス契約番号
				String svkeiCdSeq = optinmRcvSetRec.getString(ECK0141B020CBSMsg1List.TSYRN_SVKEI_CD_SEQ);	// 他システム連携サービス契約コード通番
				String rcvDiv     = optinmRcvSetRec.getString(ECK0141B020CBSMsg1List.RCV_DIV);				// 受信区分

				// サービス契約番号≠"ZZZZZZZZZZ"のメールアドレスが連絡先メールアドレスの場合、処理しない。
				// ※サービス契約番号＝"ZZZZZZZZZZ"のデータで処理するため。
				if (!SVC_KEI_NO_RRKS_MLAD.equals(svcKeiNo) && mlad.equals(rrksMlad))
				{
					continue;
				}
				
				for(Map<String, String> mailRcvMap : mailRcvList)
				{
					String paramSvcKeiNo = (String)mailRcvMap.get(CKSV9036_CKSV9036OP_CKSV903601CC_mail_rcv_list.SVC_KEI_NO);
					String paramSvkeiCdSeq = (String)mailRcvMap.get(CKSV9036_CKSV9036OP_CKSV903601CC_mail_rcv_list.TSYRN_SVKEI_CD_SEQ);
					String paramColumnNumber = (String)mailRcvMap.get(CKSV9036_CKSV9036OP_CKSV903601CC_mail_rcv_list.KMK_NUMBER);
					String paramRcvDiv = (String)mailRcvMap.get(CKSV9036_CKSV9036OP_CKSV903601CC_mail_rcv_list.RCV_DIV);

					// オプトインメール番号、サービス契約番号、他システム連携サービス契約コード通番が一致した場合、同一データ
					// ※連絡先メールアドレスの場合、サービス契約番号="ZZZZZZZZZZ"、他システム連携サービス契約コード通番="0"とする
					if (optinmNo.equals(paramColumnNumber) && svcKeiNo.equals(paramSvcKeiNo) && svkeiCdSeq.equals(paramSvkeiCdSeq) && !paramRcvDiv.equals(rcvDiv))
					{
						//オプトインメール受信設定登録(回復考慮)
						Map tmpResult = addOptinmRcvSetteKaihk(handle, param, opeDate, sysid, optinmNo, mlad, paramRcvDiv, lastCustUpdDtm);
						// エラー判定
						result = (Map)tmpResult.get("result");
						if (isSuccess(result))
						{
							lastCustUpdDtm = (String)tmpResult.get("upd_dtm_sysid");
						}
						else
						{
							returnCd = PMP_ERR_OTHER; // その他のエラー
						}
						break;
					}
				}
				
				// エラーが発生した場合、ループ終了
				if (!PMP_NORMAL_END.equals(returnCd))
				{
					break;
				}
			}
		}

		/***************************************************/
		/** 返却パラメータ設定                             */
		/***************************************************/

		// 最後に実行したSCの実行結果を取得
		result = getLastResult(param);

		// 下りコントロールマップのセット
		setResultCtrlData(param, result, fixedText);

		// SC実行エラーの場合は、結果に応じてリターンコードを設定
		if (PMP_ERR_OTHER.equals(returnCd)) {
			String scReturnCd = getReturnCode(result).toString();
			String scStatusCd = getStatus(result).toString();
			returnCd = ("0".equals(scReturnCd) && "1000".equals(scStatusCd)) ? PMP_ERR_PARAM : PMP_ERR_SYSTEM;
		}

		// 下りユーザデータマップのセット
		Map<String, Object> resultMap = new HashMap();
		resultMap.put(CKSV9036_CKSV9036OP_CKSV903601CC.RETURN_CD, returnCd);
		resultMap.put(CKSV9036_CKSV9036OP_CKSV903601CC.CK_UPD_DTM_RES, lastCkUpdDtm); // 最新更新日時(顧客)
		resultMap.put(CKSV9036_CKSV9036OP_CKSV903601CC.KK_UPD_DTM_RES, lastKkUpdDtm); // 最新更新日時(契約)

		setResultUserData(param, fixedText, resultMap);

		/*************************************************/
		/** 処理結果の判定                              **/
		/*************************************************/
		if (isError(result))
		{
			String errMsg = "メール受信設定更新CCの実行でエラーが発生しました。(リターンコード：" + returnCd + ")";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}
	
	/**
	 * BPチェック用パラメータ作成
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText){
		return JCKPmpScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。
	 * <br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JCKPmpScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}
	
	/**
	 * オプトインメール受信設定区分更新(回復考慮)<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param opeDate 運用日付
	 * @param sysid SYSID
	 * @param optinmNo オプトインメール番号
	 * @param mlad メールアドレス
	 * @param rcvDiv 受信区分
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @return ＳＣ実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private Map<?, ?> addOptinmRcvSetteKaihk(SessionHandle handle, IRequestParameterReadWrite param, String opeDate, String sysid, String optinmNo,
			String mlad, String rcvDiv, String updDtmBf) throws Throwable
	{

		Map returnMap = new HashMap();
		Map<?, ?> result = null;				// SC実行結果
		CAANMsg[] msgList = null;				// 検索結果

		// オプトインメール受信設定一意照会
		result = callECK0141A010(handle, param, optinmNo, sysid, mlad);

		// エラー判定
		if (isError(result))
		{
			returnMap.put("result", result);
			return returnMap;
		}

		// 検索結果を取得
		msgList = getResultMsgList(result, ECK0141A010CBSMsg.ECK0141A010CBSMSG1LIST);

		// 該当データ有りの場合
		if (msgList.length > 0)
		{
			String mapKeyPre = ECK0141A010CBSMsg.ECK0141A010CBSMSG1LIST + "[0].";
			String oldoptinmRcvSetteStat = getResultString(result, mapKeyPre + ECK0141A010CBSMsg1List.OPTINM_RCV_SETTE_STAT);
			String oldRcvDiv = getResultString(result, mapKeyPre + ECK0141A010CBSMsg1List.RCV_DIV);
			// 無効データの場合、回復処理を行う
			if (OPTINM_RCV_SETTE_STAT_MK.equals(oldoptinmRcvSetteStat))
			{
				// 受信区分が異なる場合、更新
				if (!oldRcvDiv.equals(rcvDiv))
				{
					// オプトインメール受信設定回復SC呼出
					result = callECK0141C040(handle, param, optinmNo, sysid, mlad, updDtmBf);
	
					// エラー判定
					if (isError(result))
					{
						returnMap.put("result", result);
						return returnMap;
					}
					// 更新年月日時分秒を取得
					updDtmBf = getResultString(result, ECK0141C040CBSMsg.UPD_DTM);

					// オプトインメール受信設定変更SC呼出
					result = callECK0141C020(handle, param, opeDate, sysid, optinmNo, mlad, rcvDiv, updDtmBf);
					// エラー判定
					if (isError(result))
					{
						returnMap.put("result", result);
						return returnMap;
					}
					// 更新年月日時分秒を取得
					updDtmBf = getResultString(result, ECK0141C020CBSMsg.UPD_DTM);
					
					result = callECK0141C030(handle, param, optinmNo, sysid, mlad, updDtmBf);
					
					// エラー判定
					if (isError(result))
					{
						returnMap.put("result", result);
						return returnMap;
					}
					// 更新年月日時分秒を取得
					updDtmBf = getResultString(result, ECK0141C030CBSMsg.UPD_DTM);
				}
			}
			else
			{
				// 受信区分が異なる場合、更新
				if (!oldRcvDiv.equals(rcvDiv))
				{
					// オプトインメール受信設定変更SC呼出
					result = callECK0141C020(handle, param, opeDate, sysid, optinmNo, mlad, rcvDiv, updDtmBf);
					// エラー判定
					if (isError(result))
					{
						returnMap.put("result", result);
						return returnMap;
					}
					// 更新年月日時分秒を取得
					updDtmBf = getResultString(result, ECK0141C020CBSMsg.UPD_DTM);
				}
			}
		}

		returnMap.put("result", result);
		returnMap.put("upd_dtm_sysid", updDtmBf);

		return returnMap;
	}
}
