/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKSV901401CC
*   ソースファイル名：JCKSV901401CC.java
*   作成者          ：富士通
*   日付            ：2012年01月17日
*＜機能概要＞
*  指定された条件からマスター会員の情報を取得します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/01/17   FJ）眞方    新規作成
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static eo.common.constant.JCKStrConst.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9014_CKSV9014OP_CKSV901401CC;
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.common.util.JCKLcsCommonUtil;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B060CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B060CBSMsg1List;

/**
 * 指定された条件からマスター会員の情報を取得します。
 * <BR>
 * @ author 富士通
 */
public class JCKSV901401CC extends AbstractCommonComponent implements ICommonComponent
{
	/** 当CCの内部でしか使わないエラーコード */
	private static final String PMP_ERR_OTHER = "OTHER";

	/**
	 * PMP連携マスター会員情報取得メイン処理。<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 gyomuKbn = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.GYOMU_KBN);
		String sysid = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.KEY_SYSID);
		String eoid = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.KEY_EOID);
		String popid = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.KEY_POP_ID);
		String shkEoid = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.KEY_SHK_EOID);
		String shkEoidPwd = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.KEY_SHK_EOID_PWD);
		String grpJoinCd = (String)inMap.get(CKSV9014_CKSV9014OP_CKSV901401CC.KEY_GRP_JOIN_CD);

		// 返却値を初期化
		String returnCd = PMP_NORMAL_END;
		String resSysid = null;
		String mmmbSbtCd = null;
		String svcKeiNo = null;
		String pcd = null;
		String stateNm = null;
		String cityNm = null;
		String oaztsuNm = null;
		String azchoNm = null;
		String bnchigo = null;
		String adrttm = null;
		String adrrm = null;
		String contPcd = null;
		String contBnchigo = null;
		String contAdrttm = null;
		String contAdrrm = null;
		String contAdBnktStaPst = null;

		List resSvcKeiNoList = new ArrayList();

		// 機能コード判定
		String funcCd = null;
		funcCd = ("0".equals(gyomuKbn)) ? "3" : funcCd;
		funcCd = ("1".equals(gyomuKbn)) ? "4" : funcCd;
		funcCd = ("2".equals(gyomuKbn)) ? "5" : funcCd;

		//***************************************************
		// マスター会員情報取得
		//***************************************************
		Map result = callECK0011B060(handle, param, funcCd, sysid, eoid, popid, shkEoid, shkEoidPwd, grpJoinCd, null);
		if (isSuccess(result))
		{
			CAANMsg[] dataList = getResultMsgList(result, ECK0011B060CBSMsg.ECK0011B060CBSMSG1LIST);
			if ((dataList == null) || (dataList.length == 0))
			{
				returnCd = PMP_ERR_NODATA;   // データなし
			}
			else
			{
				String mapKeyPre = ECK0011B060CBSMsg.ECK0011B060CBSMSG1LIST + "[0].";
				resSysid = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.SYSID);
				mmmbSbtCd = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.MEMBER_SBT_CD);
				contPcd = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.CONT_PCD);
				contBnchigo = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.CONT_BNCHIGO);
				contAdrttm = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.CONT_ADRTTM);
				contAdrrm = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.CONT_ADRRM);
				contAdBnktStaPst = getResultString(result, mapKeyPre + ECK0011B060CBSMsg1List.CONT_AD_BNKT_STA_PST);
				for (CAANMsg msg : dataList) {
					String svcKeiNoTmp = msg.getString(ECK0011B060CBSMsg1List.SVC_KEI_NO);
					if (!JCKBPCommon.isNullOrBlank(svcKeiNoTmp)) {
						Map recMap = new HashMap();
						recMap.put("svc_kei_no", msg.getString(ECK0011B060CBSMsg1List.SVC_KEI_NO));
						resSvcKeiNoList.add(recMap);
					}
				}
			}
		}
		else
		{
			returnCd = PMP_ERR_OTHER;   // その他のエラー
		}

		//***************************************************
		// お客様情報取得
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			result = callECK0011B050(handle, param, "1", resSysid);
			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].";
					svcKeiNo = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.SVC_KEI_NO);
					pcd = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_PCD);
					stateNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_STATE_NM);
					cityNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_CITY_NM);
					oaztsuNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_OAZTSU_NM);
					azchoNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_AZCHO_NM);
					bnchigo = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_BNCHIGO);
					adrttm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_ADRTTM);
					adrrm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_ADRRM);
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}

		//***************************************************
		// 返却パラメータ設定
		//***************************************************

		// 最後に実行した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(CKSV9014_CKSV9014OP_CKSV901401CC.RETURN_CD, returnCd);
		resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.SYSID, resSysid);
		resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.MEMBER_SBT_CD, mmmbSbtCd);
		if (JCKBPCommon.isNullOrBlank(svcKeiNo))
		{
			// 標準コンテンツ規約に未同意の場合は住所に契約者住所をセット
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.PCD, pcd);
			String[] address = JCKLcsCommonUtil.convAdForPmp(stateNm, cityNm, oaztsuNm, azchoNm, bnchigo, adrttm, adrrm);
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADDRESS1, (address.length > 0) ? address[0] : "");
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADDRESS2, (address.length > 1) ? address[1] : "");
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADDRESS3, (address.length > 2) ? address[2] : "");
		}
		else
		{
			// 標準コンテンツ規約に同意済みの場合は住所にコンテンツ住所をセット
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.PCD, contPcd);
			String[] address = JCKLcsCommonUtil.convAdForPmp(contBnchigo, contAdrttm, contAdrrm, contAdBnktStaPst);
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADDRESS1, (address.length > 0) ? address[0] : "");
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADDRESS2, (address.length > 1) ? address[1] : "");
			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADDRESS3, (address.length > 2) ? address[2] : "");
		}

//		if (MMB_SBT_CD_MASTER_HOJIN.equals(mmmbSbtCd))
//		{
//			// マスター(法人)の場合は契約者住所を会社住所にセット
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.PCD_CO, pcd);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.STATE_NM_CO, stateNm);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.CITY_NM_CO, cityNm);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.OAZTSU_NM_CO, oaztsuNm);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.AZCHO_NM_CO, azchoNm);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.BNCHIGO_CO, bnchigo);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADRTTM_CO, adrttm);
//			resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.ADRRM_CO, adrrm);
//		}

		resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.SVC_KEI_NO_LIST, resSvcKeiNoList);
		resultMap.put(CKSV9014_CKSV9014OP_CKSV901401CC.RETURN_CD, returnCd);
		setResultUserData(param, fixedText, resultMap);

		//*************************************************
		// 処理結果の判定
		//*************************************************
		if (isError(result))
		{
			String errMsg = "PMP連携マスター会員情報照会CCでエラーが発生しました)";
			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);
	}
}
