/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKSV072965MappingCC
*	ソースファイル名：JKKSV072965MappingCC.java
*	作成者			：富士通
*	日付			：2012年09月05日
*＜機能概要＞
*	マッピングCCです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/09/05	FJ			新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
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.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0961B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0961B001CBSMsg1List;

public class JKKSV072965MappingCC extends AbstractCommonComponent
{

	/**
	 * CCへのマッピング処理を行います
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings({ "unchecked" })
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		JKKUseFailMapperCC useFailMapper = new JKKUseFailMapperCC();
		
		//利用不可期間変更ＣＣ（eo光電話）
		HashMap<String, Object> KKSV072965CC = (HashMap<String, Object>) param.getData("KKSV072965CC");
		if(KKSV072965CC==null){
			return param;
		}
		
		String svcKeiNo = (String)KKSV072965CC.get("svc_kei_no");
		String mskmYmd = (String)KKSV072965CC.get("mskmYmd");
		if(StringUtils.isEmpty(svcKeiNo) || StringUtils.isEmpty(mskmYmd)){
			return param;
		}
		
		
		/** EKK0961B001_利用停止期間一覧照会 */
		// 検索条件
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("svc_kei_no", svcKeiNo);
		// EKK0961B001への呼び出しパラメータ設定
		CAANMsg template = new CAANMsg(EKK0961B001CBSMsg.class.getName());
		useFailMapper.mappingEKK0961B001SCInMsg(template, map);
		// SIF実行
		CAANMsg[] resultMsgs = callScCmn(param, handle, fixedText, useFailMapper, template);
		// 結果を取得
		ArrayList<HashMap<String, Object>> listEKK0961B001 = mappingCAANOutMsg(EKK0961B001CBSMsg.EKK0961B001CBSMSG1LIST, resultMsgs);
		
		// 利用不可期間がヒットした場合
		if(!listEKK0961B001.isEmpty()){
			// S-IFは利用停止開始年月日時分秒の昇順で返却するので、最新を取得
			HashMap<String, Object> mapEKK0961B001 = listEKK0961B001.get(listEKK0961B001.size()-1);
			
			String use_stp_sta_dtm = (String) mapEKK0961B001.get(EKK0961B001CBSMsg1List.USE_STP_STA_DTM);
			String use_stp_end_dtm = (String) mapEKK0961B001.get(EKK0961B001CBSMsg1List.USE_STP_END_DTM);
			
			String useStpStaYmd = "20991231";
			if(!StringUtils.isEmpty(use_stp_sta_dtm) && use_stp_sta_dtm.length()>=8){
				useStpStaYmd = use_stp_sta_dtm.substring(0,8);
			}
			
			String useStpEndYmd = "20991231";
			if(!StringUtils.isEmpty(use_stp_end_dtm) && use_stp_end_dtm.length()>=8){
				useStpEndYmd = use_stp_end_dtm.substring(0,8);
			}
			
			// 利用停止開始・終了がともに申込年月日以降のものを今回の住所変更起因の利用不可とみなし、処理対象とする
			if( mskmYmd.compareTo(useStpStaYmd) <= 0 && mskmYmd.compareTo(useStpEndYmd) <= 0 ){
				
				// 利用停止期間番号 → 利用停止期間更新マップ.利用停止期間番号
				KKSV072965CC.put("key_use_stp_prd_no", mapEKK0961B001.get(EKK0961B001CBSMsg1List.USE_STP_PRD_NO));
				// 利用停止取扱コード → 利用停止期間更新マップ.利用停止取扱コード
				KKSV072965CC.put("use_stp_toriatsu_cd", mapEKK0961B001.get(EKK0961B001CBSMsg1List.USE_STP_TORIATSU_CD));
				// 利用停止理由メモ → 利用停止期間更新マップ.利用停止理由メモ
				String use_stp_rsn_memo = (String)mapEKK0961B001.get(EKK0961B001CBSMsg1List.USE_STP_RSN_MEMO);
				KKSV072965CC.put("use_stp_rsn_memo", "（削除）" + JKKStringUtil.nullToBlank(use_stp_rsn_memo));
				
				// 利用停止開始年月日時分秒
				KKSV072965CC.put("use_stp_sta_dtm", use_stp_sta_dtm);
				// 利用停止終了年月日時分秒（開始日と同日を設定して利用不可期間0日とすることで削除する）
				KKSV072965CC.put("use_stp_end_dtm", use_stp_sta_dtm);
				
				// 利用停止期間登録年月日 → 利用停止期間更新マップ.利用停止期間登録年月日
				KKSV072965CC.put("use_stp_prd_add_ymd", mapEKK0961B001.get(EKK0961B001CBSMsg1List.USE_STP_PRD_ADD_YMD));
				// 更新年月日時分秒（更新前） → 利用停止期間更新マップ.更新年月日時分秒（更新前）
				KKSV072965CC.put("upd_dtm_bf", mapEKK0961B001.get(EKK0961B001CBSMsg1List.UPD_DTM));
			}
		}


		return param;
	}
	
	/**
	 * 
	 */
	private CAANMsg[] callScCmn(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			String fixedText,
			JKKUseFailMapperCC useFailMapper,
			CAANMsg template
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		Map<?, ?> sIFResult = null;
		
		/** SC呼び出し部品 */
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービスIF共通の情報を設定
		sIFRequest = useFailMapper.editInMsgCmn(param);

		// 共通パラメータ設定
		useFailMapper.editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// エラー情報のマッピング
		useFailMapper.editResultRP(sIFResult, param, fixedText);

		errChk(sIFResult);

		return resultMsgs;
	}
	
	/**
	 * エラーチェック処理
	 * 
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// ステータス
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if ((0 != returnCode) || (0 != templateStatus))
		{
			throw new SCCallException("INVALID_RETURN_MESSAGE", String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * CAANMsg[]の結果をHashとして抽出する（一覧照会用）
	 * @param workMapKey テンプレートリストのマップキー
	 * @param resultMsgs テンプレートリスト
	 * @return サービスＩＦ実行の結果部分(ArrayListのハッシュマップ)
	 */
	private ArrayList<HashMap<String, Object>> mappingCAANOutMsg(String workMapKey,CAANMsg[] resultMsgs)
	{
		ArrayList<HashMap<String, Object>> retHashList = null;
		CAANMsg[] msgs = null;

		// 結果の抽出
		retHashList = new ArrayList<HashMap<String, Object>>();
		msgs = resultMsgs[0].getCAANMsgList(workMapKey);

		if(msgs != null)
		{
			for(int i = 0 ; i < msgs.length ; i++)
			{
				retHashList.add(msgs[i].getMsgData());
			}
		}

		return retHashList;
	}
	
}
