/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKAdChgStaYmdModCC
*	ソースファイル名：JKKAdChgStaYmdModCC.java
*	作成者			：富士通
*	日付			：2014年04月10日
*＜機能概要＞
*	住所変更・開始日補正処理の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v8.00.00	2014/04/10	FJ)寺田		新規作成(ANK-1683-00-00)
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdChgStaYmdModConstCC;
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.CCException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

/**
 * 住所変更・開始日補正処理を実施します。<p>
 * <BR>
 * @author 富士通
 */
public class JKKAdChgStaYmdModCC extends AbstractCommonComponent
{
	/** 住所変更・開始日補正CC用マッパー */
	private static ThreadLocal<JKKAdChgStaYmdModMapperCC> mapper = new ThreadLocal<JKKAdChgStaYmdModMapperCC>() {
		// 領域への設定はinitialValue()ではなくset()を使用する為、initialValue()は実装しない
	};
	/** 住所変更・開始日補正マッピングパターンCC用マッパー */
	private static ThreadLocal<JKKAdChgStaYmdModMapPatternCC> ptnMapper = new ThreadLocal<JKKAdChgStaYmdModMapPatternCC>() {
		// 領域への設定はinitialValue()ではなくset()を使用する為、initialValue()は実装しない
	};
	/** ユーザ任意文字列 */
	private static ThreadLocal<String> useFixedText = new ThreadLocal<String>() {
		// 領域への設定はinitialValue()ではなくset()を使用する為、initialValue()は実装しない
	};

	/** エラーメッセージ: パラメータ設定不正 */
	private static final String ERR_STR_PARAM = "お客様ステータス／サービス契約ステータス異常";
	
	/**
	 * 住所変更・開始日補正処理を行います。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeAdChgStaYmdMod(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		try {

			param.setControlMapData( SCControlMapKeys.ERROR_INFO, new ArrayList<Object>() );
			param.setControlMapData( SCControlMapKeys.RETURN_CODE, String.format( "%1$04d", 0 ) );
			param.setControlMapData( SCControlMapKeys.RETURN_MESSAGE, "" );
	
			/** マッパーの生成 */
			mapper.set( new JKKAdChgStaYmdModMapperCC() );
			ptnMapper.set( new JKKAdChgStaYmdModMapPatternCC( fixedText ) );
			useFixedText.set( fixedText );
	
			/** パターン判別 */
			HashMap paramMap = (HashMap)( param.getData( fixedText ) );

			// 機能コード
			String funcCode = paramMap.get(JKKAdChgStaYmdModConstCC.FUNC_CODE).toString();

			/** 照会系S-IFの呼出 **/
			HashMap inMapping = callService( handle, param, fixedText );

			/** マッピング情報取得 */
			// EKK0081A010 サービス契約一意照会
			HashMap kk0081_a010_map = getMapInfo( inMapping, JKKAdChgStaYmdModMapperCC.EKK0081A010_MAP );
			// ECK0011A010 お客様一意照会
			HashMap ck0011_a010_map = getMapInfo( inMapping, JKKAdChgStaYmdModMapperCC.ECK0011A010_MAP );

			// サービス契約ステータス
			String svcKeiStat = kk0081_a010_map.get(JKKAdChgStaYmdModConstCC.SVC_KEI_STAT).toString();
			// お客様ステータス
			String custStat = ck0011_a010_map.get(JKKAdChgStaYmdModConstCC.CUST_STAT).toString();

			// ステータスが以下の状態の場合のみ処理続行
			// サービス契約ステータス:100(サービス提供中)
			// お客様ステータス:010(登録済)、100(受付済)
			if (("010".equals(custStat) || "100".equals(custStat)) && "100".equals(svcKeiStat)) {
				
				// 申込内容承認登録
				executePatternMskm(handle, param, fixedText, inMapping, funcCode);
				// サービス契約サービス開始日変更２
				executePatternSvcStaYmdMod(handle, param, fixedText, inMapping, funcCode);
				// 進捗登録
				executePatternPrg(handle, param, fixedText, inMapping, funcCode);

			} else {
				throw new CCException( ERR_STR_PARAM, new Exception() );
			}

		} finally {
			// スレッドローカル領域の解放
			if ( mapper.get() != null ) {
				mapper.remove();
			}
			if ( ptnMapper.get() != null ) {
				ptnMapper.get().release();
				ptnMapper.remove();
			}
			if ( useFixedText.get() != null ) {
				useFixedText.remove();
			}
		}
		return param;
	}

	/**
	 * 照会系S-IFの呼出.
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 * @return  照会結果を格納したマップ情報
	 */
	@SuppressWarnings( "unchecked" )
	private HashMap callService( SessionHandle handle, IRequestParameterReadWrite param, String fixedText ) throws Exception
	{
		HashMap inMapping = new HashMap();

		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> requestMap = null;
		Map<?, ?> resultMap = null;

		// ECK0011A010 お客様一意照会
		requestMap = mapper.get().setECK0011A010( param, fixedText );
		resultMap  = scCall.run( requestMap, handle );
		HashMap ck0011_a010_map = mapper.get().getECK0011A010( param, fixedText, resultMap );
		mapper.get().scResultCheck( param );
		mapper.get().mapECK0011A010( inMapping, ck0011_a010_map );

		// EKK0081A010 サービス契約一意照会
		requestMap = mapper.get().setEKK0081A010( param, fixedText );
		resultMap  = scCall.run( requestMap, handle );
		HashMap kk0081_a010_map = mapper.get().getEKK0081A010( param, fixedText, resultMap );
		mapper.get().scResultCheck( param );
		mapper.get().mapEKK0081A010( inMapping, kk0081_a010_map );

		return inMapping;
}

	/**
	 * 実施パターン (申込内容承認登録).
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @param   inMapping  照会系S-IFの呼出結果を格納したマップ情報
	 * @param   funcCode   機能コード
	 * @throws  Exception  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	@SuppressWarnings( "unchecked" )
	private IRequestParameterReadWrite executePatternMskm( SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap inMapping, String funcCode ) throws Exception {

		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> requestMap = null;
		Map<?, ?> resultMap = null;

		/** サービスIFの呼出し - 申込内容承認登録 */
		// EKK0011D020 申込内容承認登録
		HashMap kk0011_d020_map = ptnMapper.get().mapPattern_EKK0011D020( param, inMapping );
		requestMap = mapper.get().setEKK0011D020( param, fixedText, kk0011_d020_map, funcCode );
		resultMap  = scCall.run( requestMap, handle );
		mapper.get().getEKK0011D020( param, fixedText, resultMap );
		mapper.get().scResultCheck( param );

		return param;
	}

	/**
	 * 実施パターン (サービス契約サービス開始日変更２).
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @param   inMapping  照会系S-IFの呼出結果を格納したマップ情報
	 * @param   funcCode   機能コード
	 * @throws  Exception  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	@SuppressWarnings( "unchecked" )
	private IRequestParameterReadWrite executePatternSvcStaYmdMod( SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap inMapping, String funcCode ) throws Exception {

		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> requestMap = null;
		Map<?, ?> resultMap = null;

		/** サービスIFの呼出し - サービス契約サービス開始日変更２ */
		// EKK0081C320 サービス契約サービス開始日変更２
		HashMap kk0081_c320_map = ptnMapper.get().mapPattern_EKK0081C320( param, inMapping );
		requestMap = mapper.get().setEKK0081C320( param, fixedText, kk0081_c320_map, funcCode );
		resultMap  = scCall.run( requestMap, handle );
		mapper.get().getEKK0081C320( param, fixedText, resultMap );
		mapper.get().scResultCheck( param );

		return param;
	}

	/**
	 * 実施パターン (進捗登録).
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @param   inMapping  照会系S-IFの呼出結果を格納したマップ情報
	 * @param   funcCode   機能コード
	 * @throws  Exception  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	@SuppressWarnings( "unchecked" )
	private IRequestParameterReadWrite executePatternPrg( SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap inMapping, String funcCode ) throws Exception {

		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> requestMap = null;
		Map<?, ?> resultMap = null;

		/** サービスIFの呼出し - 進捗登録 */
		// EKK1091D010 進捗登録
		HashMap kk1091_d010_map = ptnMapper.get().mapPattern_EKK1091D010( param, inMapping );
		requestMap = mapper.get().setEKK1091D010( param, fixedText, kk1091_d010_map, funcCode );
		resultMap  = scCall.run( requestMap, handle );
		mapper.get().getEKK1091D010( param, fixedText, resultMap );
		mapper.get().scResultCheck( param );

		return param;
	}

	/**
	 * マップ情報取得.
	 * <br>
	 * @param   inMapping  導出元マッピング
	 * @param   mapKey     キー情報
	 * @return  マップ情報
	 */
	@SuppressWarnings( "unchecked" )
	private HashMap getMapInfo( HashMap inMapping, String mapKey ) {
		HashMap resultMap = null;

		if ( inMapping.containsKey( mapKey ) ) {
			resultMap = (HashMap)( inMapping.get( mapKey ) );
		}

		return resultMap;
	}
}
