/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUAreaReqShokaiCC
 *   ソースファイル名：JFUAreaReqShokaiCC.java
 *   作成者          ：富士通
 *   日付            ：2013年12月13日
 *＜機能概要＞
 *   エリアリクエストの照会を行うCC
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v6.00       2013/12/20   FJ）文元    新規作成【OM-2013-0005102】同一問合せ客エリアリクエスト登録対応（問合せ番号未設定を、設定するよう変更)
 *   
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EFU0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0051A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0011B010CBSMsg;
import eo.ejb.common.JCCModelCommon;

/**
 * エリアリクエストの照会を行うCC
 * 
 * <br>
 * 
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAreaReqShokaiCC extends JFUBaseCC
{
	/** IN項目:マップキー */
	private static final String IN_PARAM_KEY = "in_param";
	/** IN項目:検索キー */
	private static final String IN_PARAM_SEARCH_KEY = "search_key";
	/** エリアリクエスト一意照会明細 */
	private static final String EFU0011A010List = "EFU0011A010CBSMsg1List";
	/** エリアリクエスト一覧照会明細 */
	private static final String EFU0011B010List = "EFU0011B010CBSMsg1List";
	/** エラーメッセージ */
	private static String SC_ERROR_STRING = "検索キー桁数エラー";

	/* ■□ エリアリクエスト一意照会SC ■□ */
	/** テンプレートIDエリアリクエスト一意照会) */
	private static final String TEMPLATE_ID_EFU0011A010 = "EFU0011A010";
	/** テンプレートID(エリアリクエスト一意照会明細) */
	private static final String TEMPLATE_ID_EFU0011A010_DETAIL = EFU0011A010CBSMsg.EFU0011A010CBSMSG1LIST;
	/** IN項目リスト(エリアリクエスト一意照会) */
	private static final List<String> IN_COLUMN_LIST_EFU0011A010 =
			Arrays.asList(EFU0011A010CBSMsg.KEY_AREA_REQ_NO);
	/** 関連チェック,エラー項目(エリアリクエスト一意照会) */
	private static final String ERROR_COLUMN_EFU0011A010 = EFU0011A010CBSMsg.KEY_AREA_REQ_NO_ERR;
	/** SC実行結果取得キー(エリアリクエスト一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EFU0011A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EFU0011A010 + TEMP_TEMPLATE_PRIFIX_SEP;
	
	/* ■□ エリアリクエスト一覧照会SC ■□ */
	/** テンプレートIDエリアリクエスト一覧照会) */
	private static final String TEMPLATE_ID_EFU0011B010 = "EFU0011B010";
	/** テンプレートID(エリアリクエスト一覧照会明細) */
	private static final String TEMPLATE_ID_EFU0011B010_DETAIL = EFU0011B010CBSMsg.EFU0011B010CBSMSG1LIST;
	/** IN項目リスト(エリアリクエスト一覧照会) */
	private static final List<String> IN_COLUMN_LIST_EFU0011B010 =
			Arrays.asList(EFU0011B010CBSMsg.KEY_PROSCST_NO);
	/** 関連チェック,エラー項目(エリアリクエスト一覧照会) */
	private static final String ERROR_COLUMN_EFU0011B010 = EFU0011B010CBSMsg.KEY_PROSCST_NO_ERR;
	/** SC実行結果取得キー(エリアリクエスト一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_EFU0011B010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EFU0011B010 + TEMP_TEMPLATE_PRIFIX_SEP;	

	/* ■□ 問合せ客一意照会SC ■□ */
	/** テンプレートID(問合せ客一意照会) */
	private static final String TEMPLATE_ID_ECK0051A010 = "ECK0051A010";
	/** テンプレートID(問合せ客一意照会明細) */
	private static final String TEMPLATE_ID_ECK0051A010_DETAIL = ECK0051A010CBSMsg.ECK0051A010CBSMSG1LIST;
	/** IN項目リスト(問合せ客一意照会) */
	private static final List<String> IN_COLUMN_LIST_ECK0051A010 =
			Arrays.asList(ECK0051A010CBSMsg.KEY_PROSCST_NO);
	/** 関連チェック,エラー項目(問合せ客一意照会) */
	private static final String ERROR_COLUMN_ECK0051A010 = ECK0051A010CBSMsg.KEY_PROSCST_NO_ERR;
	/** SC実行結果取得キー(問合せ客一意照会) */
	private static final String TEMP_TEMPLATE_KEY_ECK0051A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_ECK0051A010 + TEMP_TEMPLATE_PRIFIX_SEP ;
	
	/**
	 * エリアリクエスト照会処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite getAreaReqShokai(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 検索キー
		String inSearchKey = (String)inMap.get(IN_PARAM_SEARCH_KEY);
		String searchKey = null;
		
		// 複合化を行う
		searchKey = JCCModelCommon.getDecryptResultPassword(inSearchKey);
		
		// 処理判定
		if (!execProc(searchKey))
		{
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		
		// 初期設定
		String proscstNo = null;
		
		if (searchKey.length() == 12)
		{
			// 検索キーが12桁（エリアリクエスト番号）
			
			// ●エリアリクエスト一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EFU0011A010);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapAreaReqSearch(param, fixedText, searchKey);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EFU0011A010, TEMPLATE_ID_EFU0011A010_DETAIL, IN_COLUMN_LIST_EFU0011A010,
					ERROR_COLUMN_EFU0011A010);
			// 結果取得
			if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EFU0011A010 + "1", TEMPLATE_ID_EFU0011A010_DETAIL))
			{
				// 問合せ客番号
				proscstNo =
						getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_EFU0011A010 + "1", 
								TEMPLATE_ID_EFU0011A010_DETAIL, EFU0011A010CBSMsg1List.PROSCST_NO, 0);
			}
		}
		
		if (searchKey.length() == 10 || proscstNo != null)
		{
			// 検索キーが10桁（問合せ客番号）
			if (proscstNo == null)
			{
				// 問合せ客番号設定
				proscstNo = searchKey;
			}

			// ●問合せ客一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_ECK0051A010);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapProscstSearch(param, fixedText, proscstNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_ECK0051A010, TEMPLATE_ID_ECK0051A010_DETAIL, IN_COLUMN_LIST_ECK0051A010,
					ERROR_COLUMN_ECK0051A010);
		}
		
		return param;
	}

	/**
	 * エリアリクエスト照会処理（取消）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite getAreaReqShokaiByCancel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 検索キー
		if (inMap == null)
		{
			// 検索キー未設定は、キー指定なしの取消しなので処理抜け
			return param;
		}
		
		String inSearchKey = (String)inMap.get(IN_PARAM_SEARCH_KEY);
		String searchKey = null;
		
		// 処理判定１
		// 検索キーが未設定の場合、処理抜けする
		// （取消画面を直接起動、改修前の、問合せ番号が無いリンク先をクリックを想定)
		if (inSearchKey == null || inSearchKey.length() == 0)
		{
			return param;
		}
		
		// 複合化を行う
		searchKey = JCCModelCommon.getDecryptResultPassword(inSearchKey);
		
		// 処理判定２
		if (!execProc(searchKey))
		{
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		
		if (searchKey.length() == 12)
		{
			// 検索キーが12桁（エリアリクエスト番号）

			// ●エリアリクエスト一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EFU0011A010);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapAreaReqSearch(param, fixedText, searchKey);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EFU0011A010, TEMPLATE_ID_EFU0011A010_DETAIL, IN_COLUMN_LIST_EFU0011A010,
					ERROR_COLUMN_EFU0011A010);
			// 結果取得
			if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_EFU0011A010 + "1", TEMPLATE_ID_EFU0011A010_DETAIL))
			{
				List wkList =
					getTemplateList(inMap, TEMP_TEMPLATE_KEY_EFU0011A010 + "1",TEMPLATE_ID_EFU0011A010_DETAIL);
				// EFU0011B010のマップに再設定(後続のEFU0011C010で使用する為)
				setWorkMap(param, wkList, fixedText);
			}
		}
		else 
		{
			// 検索キーが10桁（問合せ客番号）

			// ●エリアリクエスト一覧照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EFU0011B010);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapAreaReqViewSearch(param, fixedText, searchKey);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EFU0011B010, TEMPLATE_ID_EFU0011B010_DETAIL, IN_COLUMN_LIST_EFU0011B010,
					ERROR_COLUMN_EFU0011B010);
		}

		return param;
	}
	
	/**
	 * 処理判定
	 * 
	 * <br>
	 * @param searchKey 検索キー
	 * @return true：処理判定結果OK false：処理判定結果ERR
	 */
	private boolean execProc(String searchKey)
	{
		// 検索キーの桁数が10桁または12桁以外はエラーとする
		// 10桁：問合せ客番号 12桁：エリアリクエスト番号
		if (searchKey.length() == 10 || searchKey.length() == 12)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
		
	/**
	 * 上りマッピング項目設定(エリアリクエスト一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param searchKey 検索キー
	 * @throws RequestParameterException 
	 */
	private void setInMapAreaReqSearch(IRequestParameterReadWrite param, String fixedText, String searchKey) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		HashMap paramMap = (HashMap)inMap.get(IN_PARAM_KEY);

		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿エリアリクエスト番号
		inMap.put(EFU0011A010CBSMsg.KEY_AREA_REQ_NO, searchKey);

	}
	
	/**
	 * 上りマッピング項目設定(問合せ客一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param proscstNo 問合せ客番号
	 * @throws RequestParameterException 
	 */
	private void setInMapProscstSearch(IRequestParameterReadWrite param, String fixedText, String proscstNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿問合せ客番号
		inMap.put(ECK0051A010CBSMsg.KEY_PROSCST_NO, proscstNo);

	}
	
	/**
	 * 上りマッピング項目設定(エリアリクエスト一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param proscstNo 問合せ客番号
	 * @throws RequestParameterException 
	 */
	private void setInMapAreaReqViewSearch(IRequestParameterReadWrite param, String fixedText, String proscstNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿問合せ客番号
		inMap.put(EFU0011B010CBSMsg.KEY_PROSCST_NO, proscstNo);

	}
	
	/**
	 * ワークマップに設定
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param wkList 設定するリスト
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException 
	 */
	private IRequestParameterReadWrite setWorkMap(IRequestParameterReadWrite param, List wkList, String fixedText) throws RequestParameterException
	{
		
		HashMap inMap = (HashMap)param.getData(fixedText);
		ArrayList childList = (ArrayList)inMap.get(EFU0011A010List);
		inMap.put(EFU0011B010List, childList);

		return param;
	}
	
	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

}
