/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKSV902801CC
*   ソースファイル名：JCKSV902801CC.java
*   作成者          ：富士通
*   日付            ：2011年12月14日
*＜機能概要＞
*  対象会員の連絡用メールアドレスを仮登録する。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/14   FJ）三浦    新規作成
*   v27.00.00   2016/10/10   FJ) 阮      ANK-2987-00-00対応    
*   v27.01.00   2016/10/17   FJ) 阮      IT2-2016-0000054対応  
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.addUpdRrksMlad;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.callECK0011B050;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.callECK0011B120;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.callECKA9020001;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.checkKyohiMailDomain;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.checkSameMmb;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.getLastResult;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.getResultMsgList;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.getResultString;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.getReturnCode;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.getStatus;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.isError;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.isSuccess;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.setResultCtrlData;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.setResultUserData;
import static eo.common.constant.JCKStrConst.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.*;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9028_CKSV9028OP_CKSV902801CC;
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.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B120CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B120CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECKA9020001CBSMsg;



/**
 * 対象会員の連絡用メールアドレスを仮登録する。
 * <BR>
 * @author 富士通
 */
public class JCKSV902801CC 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 sysid = (String)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.SYSID);
		String rrkMlad = (String)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.RRK_MLAD);
		String ckUpdDtm = (String)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.CK_UPD_DTM);
		String kkUpdDtm = (String)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.KK_UPD_DTM);
		// ANK-2987-00-00 ADD START
		String svcKeiNo = (String)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.SVC_KEI_NO);
		String tsyrnSvkeicdSeq = (String)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.TSYRN_SVKEI_CD_SEQ);
		List mailRcvSetteList = (List)inMap.get(CKSV9028_CKSV9028OP_CKSV902801CC.MAIL_RCV_SETTE_LIST);
		// ANK-2987-00-00 ADD END

		// リターンコード初期化
		String returnCd = PMP_NORMAL_END;

		//***************************************************
		// 内部で使用する変数の初期化
		//***************************************************
		String opeDate = JCCBPCommon.getOpeDate(null);
		String contCustNm = null;
		String contCustKana = null;
		String contCustBirthd = null;
		String lastCustUpdDtm = null;
// IT2-2016-0000054 ADD START
		String CustNm = null;
// IT2-2016-0000054 ADD END

		//***************************************************
		// PMP連携用排他制御
		//***************************************************
		Map 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;
		}

		//***************************************************
		// 最終更新日時チェック
		//***************************************************
		String lastCkUpdDtm = null;
		String lastKkUpdDtm = null;
		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 = chkCkUpdDtm;
				if ((!ckUpdDtm.equals(chkCkUpdDtm)) || (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 = callECK0011B050(handle, param, "1", sysid);
			if (isSuccess(result))
			{
				CAANMsg[] dataList = getResultMsgList(result, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
				if ((dataList == null) || (dataList.length == 0))
				{
					returnCd = PMP_ERR_NODATA;   // データなし
				}
				else
				{
					String mapKeyPre = ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST + "[0].";
					contCustNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CONT_CUST_NM);
					// IT2-2016-0000054 ADD START
					CustNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CUST_NM);
					// IT2-2016-0000054 ADD END
					contCustKana = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CONT_CUST_KANA);
					contCustBirthd = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CONT_CUST_BIRTHD);
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}
		
		//***************************************************
		// 拒否メールドメインチェック
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			//メールアドレスをアドレスとドメインに分割する。
			String mailDomain = rrkMlad.substring(rrkMlad.indexOf("@") + 1);

			if (!checkKyohiMailDomain(handle, param, opeDate, mailDomain))
			{
				returnCd = PMP_ERR_REJECT_DOMAIN;// 拒否メールドメインチェックエラー
			}
			
		}

		//***************************************************
		// 同一人チェック
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			if (!checkSameMmb(handle, param, contCustKana, contCustBirthd, rrkMlad, sysid))
			{
				returnCd = PMP_ERR_MMB_DUP;   // フリガナ氏名、生年月日、連絡用アドレス重複エラー
			}
		}
		
		// IT2-2016-0000054 ADD START
		//***************************************************
		// 連絡先メールアドレス仮登録
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			//連絡先メールアドレス登録更新
			Map tmpResult = addUpdRrksMlad(handle, param, opeDate, "2", sysid, rrkMlad, lastCustUpdDtm, opeDate);
			
			result = (Map)tmpResult.get("result");
			if (isSuccess(result))
			{
				lastCustUpdDtm = (String)tmpResult.get("upd_dtm_sysid");
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}
		// IT2-2016-0000054 ADD END
		
		// ANK-2987-00-00 ADD START
		//**************************************************
		// お客様情報取得
		//**************************************************
		String memberSbtCd = null;
		String nowMlad = null;
		String chgechuMlad = null;
		if (PMP_NORMAL_END.equals(returnCd))
		{
			//お客様情報照会（PMP連携）
			result = callECK0011B050(handle, param, "1", sysid);
			if (isSuccess(result))
			{
				
				CAANMsg[] dataList = getResultMsgList(result, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
				if ((dataList == null) || (dataList.length == 0))
				{
					returnCd = PMP_ERR_NODATA;   // データなし
				}
				else
				{
					String mapKeyPre = ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST + "[0].";
					memberSbtCd = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.MEMBER_SBT_CD);
					nowMlad =  getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.MLAD);
					chgechuMlad = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CHGECHU_MLAD);
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}
		
		//***************************************************
		// オプトインメール受信設定登録
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			Map tmpResult = 
				addUpdOptinmRcvSetteKari(handle, param, opeDate, sysid, memberSbtCd, nowMlad, chgechuMlad, svcKeiNo,
						// IT2-2016-0000054 MOD START
//						tsyrnSvkeicdSeq, (List)mailRcvSetteList, lastCustUpdDtm, false);
						tsyrnSvkeicdSeq, (List)mailRcvSetteList, lastCustUpdDtm, true);
						// IT2-2016-0000054 MOD END
			
			result = (Map)tmpResult.get("result");

			if (isSuccess(result))
			{
				lastCustUpdDtm = (String)tmpResult.get("upd_dtm_sysid");
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}
		// ANK-2987-00-00 ADD END
		
		// IT2-2016-0000054 DEL START
//		//***************************************************
//		// 連絡先メールアドレス仮登録
//		//***************************************************
//		if (PMP_NORMAL_END.equals(returnCd))
//		{
//			//連絡先メールアドレス登録更新
//			Map tmpResult = addUpdRrksMlad(handle, param, opeDate, "2", sysid, rrkMlad, lastCustUpdDtm, opeDate);
//			
//			result = (Map)tmpResult.get("result");
//			if (isSuccess(result))
//			{
//				lastCustUpdDtm = (String)tmpResult.get("upd_dtm_sysid");
//			}
//			else
//			{
//				returnCd = PMP_ERR_OTHER;   // その他のエラー
//			}
//		}
		// IT2-2016-0000054 DEL END

		//***************************************************
		// 返却パラメータ設定
		//***************************************************

		// 最後に実行した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(CKSV9028_CKSV9028OP_CKSV902801CC.RETURN_CD, returnCd);
		resultMap.put(CKSV9028_CKSV9028OP_CKSV902801CC.CK_UPD_DTM_RES, lastCkUpdDtm); // 返却最新更新日時(お客様)
		resultMap.put(CKSV9028_CKSV9028OP_CKSV902801CC.KK_UPD_DTM_RES, lastKkUpdDtm); // 返却最新更新日時(サービス契約)
		resultMap.put(CKSV9028_CKSV9028OP_CKSV902801CC.RRK_MLAD_RES, rrkMlad);    // メールアドレス
		// IT2-2016-0000054 ADD START
		if (contCustNm !=  null && !"".equals(contCustNm)){
		// IT2-2016-0000054 ADD END
		resultMap.put(CKSV9028_CKSV9028OP_CKSV902801CC.CONT_CUST_NM, contCustNm); // コンテンツお客様名
		// IT2-2016-0000054 ADD START
		}
		else
		{
			// コンテンツ契約者名がない場合、お客様名で代行
			if (CustNm != null && !"".equals(CustNm)){
				resultMap.put(CKSV9028_CKSV9028OP_CKSV902801CC.CONT_CUST_NM, CustNm); // コンテンツお客様名
			}
		}
		// IT2-2016-0000054 ADD END
		setResultUserData(param, fixedText, resultMap);

		//*************************************************
		// 処理結果の判定
		//*************************************************
		if (isError(result))
		{
			String errMsg = "メールアドレス仮登録CCでエラーが発生しました(リターンコード：" + returnCd + ")";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}

	/**
	 * BPチェック用パラメータ作成。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return BPチェック用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// BPチェックはスキップする
		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);
	}
}
