/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKSV901701CC
*   ソースファイル名：JCKSV901701CC.java
*   作成者          ：富士通
*   日付            ：2012年01月18日
*＜機能概要＞
*  指定された条件からプロバイダ請求利用設定一覧情報を取得します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/01/18   FJ）眞方    新規作成
*   v6.00.00    2013/10/15   FJ）小川    ANK-1587-00-00_ECプラットフォーム
*
**********************************************************************/

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.CKSV9017_CKSV9017OP_CKSV901701CC;
import com.fujitsu.futurity.bp.custom.constant.CKSV9017_CKSV9017OP_CKSV901701CC_dataList;
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.ECN0131B004CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0131B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0131B005CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0131B005CBSMsg1List;

/**
 * 指定された条件からプロバイダ請求利用設定一覧を取得します。
 * <BR>
 * @ author 富士通
 */
public class JCKSV901701CC 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(CKSV9017_CKSV9017OP_CKSV901701CC.GYOMU_KBN);
		String keySysid = (String)inMap.get(CKSV9017_CKSV9017OP_CKSV901701CC.KEY_SYSID);

		// 返却値を初期化
		String returnCd = PMP_NORMAL_END;
		String keishaCustNm = null;
		String contCustNm = null;
		String svcKeiNo = null;

		// 機能コード判定
		String funcCd = null;
		funcCd = ("0".equals(gyomuKbn)) ? "1" : funcCd;
		funcCd = ("1".equals(gyomuKbn)) ? "1" : funcCd;
		funcCd = ("2".equals(gyomuKbn)) ? "2" : funcCd;

		//***************************************************
		// プロバイダ請求利用設定一覧取得
		//***************************************************
		CAANMsg[] listParent = null;
		Map result = callECN0131B005(handle, param, funcCd, keySysid);
		if (isSuccess(result))
		{
			listParent = getResultMsgList(result, ECN0131B005CBSMsg.ECN0131B005CBSMSG1LIST);
			if ((listParent == null) || (listParent.length == 0))
			{
				returnCd = PMP_ERR_NODATA;   // データなし
			}
		}
		else
		{
			returnCd = PMP_ERR_OTHER;   // その他のエラー
		}

		//***************************************************
		// プロバイダ請求(家族の支払方法)一覧取得
		//***************************************************
		CAANMsg[] listFamily = null;
		if (PMP_NORMAL_END.equals(returnCd) && ("1".equals(gyomuKbn)))
		{
			result = callECN0131B004(handle, param, "1", keySysid);
			if (isSuccess(result))
			{
				
				listFamily = getResultMsgList(result, ECN0131B004CBSMsg.ECN0131B004CBSMSG1LIST);
				if ((listFamily == null) || (listFamily.length == 0))
				{
					returnCd = PMP_ERR_NODATA;   // データなし
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}

		//***************************************************
		// お客様情報取得
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			result = callECK0011B050(handle, param, "1", keySysid);
			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);
					contCustNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CONT_CUST_NM);
					keishaCustNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CUST_NM);
				}
			}
			else
			{
				returnCd = PMP_ERR_OTHER;   // その他のエラー
			}
		}

		//***************************************************
		// 返却データ設定
		//***************************************************
		List dataList = new ArrayList();
		if (PMP_NORMAL_END.equals(returnCd))
		{
			if (("0".equals(gyomuKbn)) || ("2".equals(gyomuKbn)))
			{
				// 業務区分＝0(接続会員情報取得) または 2(サービスプラン情報取得)の時
				String custNm = (JCKBPCommon.isNullOrBlank(svcKeiNo)) ? keishaCustNm : contCustNm;
				for (CAANMsg recParent : listParent)
				{
					String ispSvcKeiNo = recParent.getString(ECN0131B005CBSMsg1List.ISP_KSSAI_SVC_KEI_NO);

					Map resMap = new HashMap();
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.CUST_NM, custNm);
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.FIRST_NM, JCKBPCommon.getFirstNameForPmp(custNm));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SECOND_NM, JCKBPCommon.getSecondNameForPmp(custNm));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SYSID, recParent.getString(ECN0131B005CBSMsg1List.SYSID));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.CONT_ISP_USE_FAIL_FLG, recParent.getString(ECN0131B005CBSMsg1List.CONT_ISP_USE_FAIL_FLG));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SVC_KEI_NO, recParent.getString(ECN0131B005CBSMsg1List.SVC_KEI_NO));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.CONTRACT_CD, recParent.getString(ECN0131B005CBSMsg1List.CONTRACT_CD));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SERVICE_CD, recParent.getString(ECN0131B005CBSMsg1List.SERVICE_CD));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SERVICE_NAME, recParent.getString(ECN0131B005CBSMsg1List.SERVICE_NAME));
					String selectionEnabledFlg = getSelectionEnabledFlg(recParent.getString(ECN0131B005CBSMsg1List.MMB_ISP_KSSAI_STAT_CD), 
							recParent.getString(ECN0131B005CBSMsg1List.TOKUSOKU_STAT));
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SELECTION_ENABLED_FLG, selectionEnabledFlg);
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SELECTION_FLG, (!JCKBPCommon.isNullOrBlank(ispSvcKeiNo)) ?  "1" : "0");
					resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SEIKY_KEI_NO, recParent.getString(ECN0131B005CBSMsg1List.SEIKY_KEI_NO));
					dataList.add(resMap);
				}
			}
			else
			{
				// 業務区分＝1(ファミリー会員情報取得)の時
				for (CAANMsg recFamily : listFamily)
				{
					String ispSvcKeiNo = recFamily.getString(ECN0131B004CBSMsg1List.ISP_KSSAI_SVC_KEI_NO);
					ispSvcKeiNo = (ispSvcKeiNo == null) ? "" : ispSvcKeiNo;
					for (CAANMsg recParent : listParent)
					{
						String nowSvcKeiNo = recParent.getString(ECN0131B005CBSMsg1List.SVC_KEI_NO);
						Map resMap = new HashMap();
						String familyCustNm = recFamily.getString(ECN0131B004CBSMsg1List.CONT_CUST_NM);
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.CUST_NM, familyCustNm);
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.FIRST_NM, JCKBPCommon.getFirstNameForPmp(familyCustNm));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SECOND_NM, JCKBPCommon.getSecondNameForPmp(familyCustNm));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SYSID, recFamily.getString(ECN0131B004CBSMsg1List.FAMILY_SYSID));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.CONT_ISP_USE_FAIL_FLG, recFamily.getString(ECN0131B004CBSMsg1List.CONT_ISP_USE_FAIL_FLG));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SVC_KEI_NO, recParent.getString(ECN0131B005CBSMsg1List.SVC_KEI_NO));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.CONTRACT_CD, recParent.getString(ECN0131B005CBSMsg1List.CONTRACT_CD));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SERVICE_CD, recParent.getString(ECN0131B005CBSMsg1List.SERVICE_CD));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SERVICE_NAME, recParent.getString(ECN0131B005CBSMsg1List.SERVICE_NAME));
						String selectionEnabledFlg = getSelectionEnabledFlg(recParent.getString(ECN0131B005CBSMsg1List.MMB_ISP_KSSAI_STAT_CD), 
								recParent.getString(ECN0131B005CBSMsg1List.TOKUSOKU_STAT));
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SELECTION_ENABLED_FLG, selectionEnabledFlg);
						String selectionFlg = (!"".equals(ispSvcKeiNo)) && (ispSvcKeiNo.equals(nowSvcKeiNo)) ?  "1" : "0";
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SELECTION_FLG, selectionFlg);
						resMap.put(CKSV9017_CKSV9017OP_CKSV901701CC_dataList.SEIKY_KEI_NO, recParent.getString(ECN0131B005CBSMsg1List.SEIKY_KEI_NO));
						dataList.add(resMap);
					}
				}
			}
		}

		//***************************************************
		// 返却パラメータ設定
		//***************************************************

		// 最後に実行した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(CKSV9017_CKSV9017OP_CKSV901701CC.DATALIST, dataList);
		resultMap.put(CKSV9017_CKSV9017OP_CKSV901701CC.RETURN_CD, returnCd);
		setResultUserData(param, fixedText, resultMap);

		//*************************************************
		// 処理結果の判定
		//*************************************************
		if (isError(result))
		{
			String errMsg = "PMP連携プロバイダ請求利用設定一覧取得CCでエラーが発生しました。";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}

	/**
	 * 選択可否フラグの取得。<br />
	 * <pre>会員ISP決済状態コード、督促ステータスからISP決済サービス契約番号の選択可否フラグを算出する。</pre>
	 * @param mmbIspKssaiStatCd 会員ISP決済状態コード
	 * @param tokusokuStat 督促ステータス
	 * @return 選択可否フラグ（0:選択可、1:選択不可）
	 */
	private String getSelectionEnabledFlg(String mmbIspKssaiStatCd, String tokusokuStat)
	{
		String selectionEnabledFlg =  "0";
		if (ISP_KSSAI_STAT_CD_STP.equals(mmbIspKssaiStatCd) || TOKUSOKU_STAT_USE_STP.equals(tokusokuStat))
		{
			selectionEnabledFlg = "1";
		}
		return selectionEnabledFlg;
	}

	/**
	 * 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);
	}
}
