/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JACACSV0024MappingParts
*   ソースファイル名：JACACSV0024MappingParts.java
*   作成者          ：富士通
*   日付            ：2012年02月07日
*＜機能概要＞
*   料金内訳情報取得サービスのBPマッピング呼出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v2.00.00	2012/02/07	富士通		新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;

import eo.common.constant.JACStrConst;

/**
 * 料金内訳情報取得サービスにおけるBP-サービスIFマッピング処理で呼び出される部品です。<p>
 * <BR>
 * @author 富士通
 */
public class JACACSV0024MappingParts {

	/** 最大長(サービスコード) */
	private static final int MAX_LEN_SVC_CD = 2;

	/** 最大長(料金コースコード) */
	private static final int MAX_LEN_PCRS_CD = 3;

	/** 最大長(料金グループコード) */
	private static final int MAX_LEN_PRC_GRP_CD = 2;

	/** 最大長(料金サービスコード) */
	private static final int MAX_LEN_PRC_SVC_CD = 12;
	
	/** 最大長(料金プランコード) */
	private static final int MAX_LEN_PPLAN_CD = 6;

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに
	 * マッピングするサービスコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース
	 * の下り明細の先頭行から取得する。
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、
	 * 指定値がないものとして、空文字(サービスコードの最大桁)を取得する。
	 * <br>
	 * @param param             リクエストパラメータ操作クラス
	 * @param scNamePrcKmk      料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey サービスコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs        料金コース一覧照会SC名
	 * @param listNamePcrs      料金コース一覧照会明細名
	 * @param itemNamePcrsCd    サービスコード項目名(料金コース一覧照会)
	 * @return サービスコード
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	public static String getSvcCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNameSvcCdKey,
									String scNameSvc, String listNameSvc, String itemNameSvcCd) throws RequestParameterException {
		String svcCd = null;

		// 料金項目出力名称一覧照会マップよりサービスコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keySvcCd = (String)dataMap.get(itemNameSvcCdKey);
			if (keySvcCd != null && JACStrConst.KARA_MOJI.equals(keySvcCd) == false)
			{
				svcCd = keySvcCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金グループコードを取得する
		if (svcCd == null)
		{
			try
			{
				svcCd = JPCBPCommon.getBPListValueString(param, scNameSvc, listNameSvc, 0, itemNameSvcCd);
			}
			catch (NullPointerException ex)
			{
				svcCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (svcCd == null)
		{
			svcCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_SVC_CD);
		}

		return svcCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに
	 * マッピングする料金グループコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース
	 * の下り明細の先頭行から取得する。
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、
	 * 指定値がないものとして、空文字(料金グループコードの最大桁)を取得する。
	 * <br>
	 * @param param             リクエストパラメータ操作クラス
	 * @param scNamePrcKmk      料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey 料金グループコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs        料金コース一覧照会SC名
	 * @param listNamePcrs      料金コース一覧照会明細名
	 * @param itemNamePcrsCd    料金グループコード項目名(料金コース一覧照会)
	 * @return 料金グループコード 
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	public static String getPrcGrpCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePrcGrpCdKey,
									String scNamePcrs, String listNamePcrs, String itemNamePrcGrp) throws RequestParameterException {
		String prcGrpCd = null;

		// 料金項目出力名称一覧照会マップより料金コースコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPrcGrpCd = (String)dataMap.get(itemNamePrcGrpCdKey);
			if (keyPrcGrpCd != null && JACStrConst.KARA_MOJI.equals(keyPrcGrpCd) == false)
			{
				prcGrpCd = keyPrcGrpCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金グループコードを取得する
		if (prcGrpCd == null)
		{
			try
			{
				prcGrpCd = JPCBPCommon.getBPListValueString(param, scNamePcrs, listNamePcrs, 0, itemNamePrcGrp);
			}
			catch (NullPointerException ex)
			{
				prcGrpCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (prcGrpCd == null)
		{
			prcGrpCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PRC_GRP_CD);
		}

		return prcGrpCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに
	 * マッピングする料金コースコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース
	 * の下り明細の先頭行から取得する。
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、
	 * 指定値がないものとして、空文字(料金コースコードの最大桁)を取得する。
	 * <br>
	 * @param param             リクエストパラメータ操作クラス
	 * @param scNamePrcKmk      料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey 料金コースコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs        料金コース一覧照会SC名
	 * @param listNamePcrs      料金コース一覧照会明細名
	 * @param itemNamePcrsCd    料金コースコード項目名(料金コース一覧照会)
	 * @return 料金コースコード 
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	public static String getPcrsCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePcrsCdKey,
									String scNamePcrs, String listNamePcrs, String itemNamePcrsCd) throws RequestParameterException {
		String pcrsCd = null;

		// 料金項目出力名称一覧照会マップより料金コースコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPcrsCd = (String)dataMap.get(itemNamePcrsCdKey);
			if (keyPcrsCd != null && JACStrConst.KARA_MOJI.equals(keyPcrsCd) == false)
			{
				pcrsCd = keyPcrsCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金コースコードを取得する
		if (pcrsCd == null)
		{
			try
			{
				pcrsCd = JPCBPCommon.getBPListValueString(param, scNamePcrs, listNamePcrs, 0, itemNamePcrsCd);
			}
			catch (NullPointerException ex)
			{
				pcrsCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (pcrsCd == null)
		{
			pcrsCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PCRS_CD);
		}

		return pcrsCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに
	 * マッピングする料金コースコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース
	 * の下り明細の先頭行から取得する。
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、
	 * 指定値がないものとして、空文字(料金プランコードの最大桁)を取得する。
	 * <br>
	 * @param param             リクエストパラメータ操作クラス
	 * @param scNamePrcKmk      料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey 料金コースコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs        料金コース一覧照会SC名
	 * @param listNamePcrs      料金コース一覧照会明細名
	 * @param itemNamePcrsCd    料金コースコード項目名(料金コース一覧照会)
	 * @return 料金プランコード 
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	public static String getPplanCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePcrsCdKey,
									String scNamePcrs, String listNamePcrs, String itemNamePcrsCd) throws RequestParameterException {
		String pplanCd = null;

		// 料金項目出力名称一覧照会マップより料金プランコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPcrsCd = (String)dataMap.get(itemNamePcrsCdKey);
			if (keyPcrsCd != null && JACStrConst.KARA_MOJI.equals(keyPcrsCd) == false)
			{
				pplanCd = keyPcrsCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金プランコードを取得する
		if (pplanCd == null)
		{
			try
			{
				pplanCd = JPCBPCommon.getBPListValueString(param, scNamePcrs, listNamePcrs, 0, itemNamePcrsCd);
			}
			catch (NullPointerException ex)
			{
				pplanCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (pplanCd == null)
		{
			pplanCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PPLAN_CD);
		}

		return pplanCd;
	}
	
	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに
	 * マッピングする料金サービスコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、
	 * または料金サービス一覧照会(キャンペーン情報一覧照会)サービスインターフェース
	 * の下り明細の先頭行から取得する。
	 * ユーザリクエスト値、料金サービス一覧照会の何れからも取得できない場合は、
	 * 指定値がないものとして、空文字(料金サービスコードの最大桁)を取得する。
	 * <br>
	 * @param param               リクエストパラメータ操作クラス
	 * @param scNamePrcKmk        料金項目出力名称一覧照会SC名
	 * @param itemNamePrcSvcCdKey 料金コースコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePrcSvc        料金サービス一覧照会SC名
	 * @param listNamePrcSvc      料金サービス一覧照会明細名
	 * @param itemNamePrcSvcCd    料金サービスコード項目名(料金サービス一覧照会)
	 * @return 料金サービスコード 
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	public static String getPrcSvcCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePrcSvcCdKey,
									String scNamePrcSvc, String listNamePrcSvc, String itemNamePrcSvcCd) throws RequestParameterException {
		String prcSvcCd = null;

		// 料金項目出力名称一覧照会マップより料金サービスコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPrcSvcCd = (String)dataMap.get(itemNamePrcSvcCdKey);
			if (keyPrcSvcCd != null && JACStrConst.KARA_MOJI.equals(keyPrcSvcCd) == false)
			{
				prcSvcCd = keyPrcSvcCd;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (prcSvcCd == null)
		{
			prcSvcCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PRC_SVC_CD);
		}

		return prcSvcCd;
	}

	/**
	 * 指定された文字列に対して、指定された長さになるまで左側に文字を埋めます。
	 * <br>
	 * @param source   対象文字列
	 * @param value    埋める文字
	 * @param length   長さ
	 * @return         結果文字列  
	 */
	private static String padLeft(String source, String value, int length)
	{
		String sourceValue = null;
		if (source == null)
		{
			sourceValue = JACStrConst.KARA_MOJI;
		}
		else
		{
			sourceValue = new String(source);
		}

		StringBuffer editor = new StringBuffer(sourceValue);

		int len = sourceValue.length();
		if (len < length)
		{
			int padLen = length - len;
			for (int i = 0; i < padLen; i++)
			{
				editor.insert(0, value);
			}
		}

		return editor.toString();
	}

}
