/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKBPCommon
*   ソースファイル名：JCKBPCommon.java
*   作成者          ：富士通
*   日付            ：2011年12月05日
*＜機能概要＞
*   サービスコンポーネント呼出用のパラメータ編集を行う。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/05   富士通      新規作成
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static eo.common.constant.JCKStrConst.PMP_KATAKANA_CHOKUON;
import static eo.common.constant.JCKStrConst.PMP_KATAKANA_YOUON;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.values.MessageID;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JCNStrConst;
import eo.common.util.JPCCommonUtil;
import eo.common.util.JPCUtilCommon;

/**
 * ＢＰ共通アクセッサー部品です。<p>
 * サービスで実装します。<p>
 * <BR>
 * @ author 富士通
 */
public class JCNBPCommon extends JPCUtilCommon {

	/**
	 * オブジェクトがNULL、または空文字か判定します。<br />
	 * @param val 判定するオブジェクト
	 * @return NULL または空文字の場合はtrue
	 */
	public static boolean isNullOrBlank(Object val){
		if (val == null) 
		{
			return true;
		}

		return 0 == val.toString().length();
	}

	/**
	 * リストがNULL、または０件か判定します。
	 * @param list 判定するリストオブジェクト
	 * @return NULL または０件のリストの場合はtrue
	 */
	@SuppressWarnings("unchecked")
	public static boolean isNullOrEmpty(List list){
		return ((list == null) || (list.isEmpty())) ? true : false;
	}

	/**
	 * 文字列存在チェック。<br />
	 * 指定された文字列が、配列に存在するかチェックする。<br />
	 * @param val チェック対象の文字列
	 * @param strAry 存在チェックする文字列配列
	 * @return true:存在する、false:存在しない
	 */
	public static boolean inArray(String val, String...strAry){
		val = (val != null) ? val : "";
		for (String chkStr : strAry)
		{
			chkStr = (chkStr != null) ? chkStr : "";
			if (chkStr.equals(val)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * <br />
	 * ※指定がない項目は自動的にnullをセットしてパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParamForSearch(IRequestParameterReadOnly param, String templateId, Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCNDslScParamHenshu.createScParamForSearch(param, templateId, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * <br />
	 * ※指定がない項目は自動的にnullをセットしてパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParamForSearch(IRequestParameterReadOnly param,Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCNDslScParamHenshu.createScParamForSearch(param, null, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParam(IRequestParameterReadOnly param, Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCNDslScParamHenshu.createScParam(param, null, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * SC呼出用のパラメータを作成します。
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	public static HashMap<String, Object> createScParam(IRequestParameterReadOnly param, String templateId, Class<?> cbsMsgClass,
			Map<?, ?> param4serviceIf, String funcCode) throws RequestParameterException {
		return JCNDslScParamHenshu.createScParam(param, templateId, cbsMsgClass, param4serviceIf, funcCode);
	}

	/**
	 * ＢＰの下り電文コントロールデータを設定します。
	 * @param param リクエストパラメータ
	 * @param result サービスコンポーネント実行結果
	 * @param scMapkey サービスコンポーネントID
	 * @throws Throwable 
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result, String scMapkey) throws Throwable {
		JCNDslScParamHenshu.setResultCtrlData(param, result, scMapkey);
	}

	/**
	 * ＢＰの下り電文コントロールデータを設定します。
	 * @param param リクエストパラメータ
	 * @param result サービスコンポーネント実行結果
	 * @throws Throwable
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result) throws Throwable {
		JCNDslScParamHenshu.setResultCtrlData(param, result, null);
	}

	/**
	 * ＢＰの下り電文コントロールデータを設定します。
	 * @param param リクエストパラメータ
	 * @param result サービスコンポーネント実行結果
	 * @param scMapkey サービスコンポーネントID
	 * @param returnCd リターンコード
	 * @param status ステータスコード
	 * @throws Throwable
	 */
	public static void setResultCtrlData(IRequestParameterReadWrite param, Map<?, ?> result, String scMapkey, Object returnCd, Object status)
			throws Throwable {
		JCNDslScParamHenshu.setResultCtrlData(param, result, scMapkey, returnCd, status);
	}

	/**
	 * ＢＰの下り電文ユーザデータを設定します。
	 * @param param リクエストパラメータ
	 * @param scMapkey サービスコンポーネントID
	 * @param userData ユーザデータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public static void setResultUserData(IRequestParameterReadWrite param, String scMapkey, Map userData) throws Throwable {
		JCNDslScParamHenshu.setResultUserData(param, scMapkey, userData);
	}

	/**
	 * サービスコンポーネントの実行結果からリストを取得します。
	 * @param result サービスコンポーネント実行結果
	 * @param listName リスト名
	 * @return 結果(リスト)
	 */
	public static CAANMsg[] getResultMsgList(Map<?, ?> result, String listName) {
		return JCNDslScParamHenshu.getResultMsgList(result, listName);
	}

	/**
	 * サービスコンポーネントの実行結果から文字列を取得します。
	 * @param result サービスコンポーネント実行結果
	 * @param columnName 項目名
	 * @return 結果(文字列)
	 */
	public static String getResultString(Map<?, ?> result, String columnName) {
		return JCNDslScParamHenshu.getResultString(result, columnName);
	}

	/**
	 * サービスコンポーネントの実行結果から数値を取得します。
	 * @param result サービスコンポーネント実行結果
	 * @param columnName 項目名
	 * @return 結果(数値)
	 */
	public static Integer getResultInteger(Map<?, ?> result, String columnName) {
		return JCNDslScParamHenshu.getResultInteger(result, columnName);
	}

	/**
	 * サービスコンポーネントの実行結果からエラー有無を判定します。
	 * @param result サービスコンポーネント実行結果
	 * @return エラー有無(true:エラー有り、false:エラー無し)
	 */
	public static boolean isError(Map<?, ?> result) {
		return JCNDslScParamHenshu.isError(result);
	}

	/**
	 * サービスコンポーネントの実行結果からエラー有無を判定します。
	 * @param result サービスコンポーネント実行結果
	 * @return エラー有無(false:エラー有り、true:エラー無し)
	 */
	public static boolean isSuccess(Map<?, ?> result) {
		return JCNDslScParamHenshu.isSuccess(result);
	}

	/**
	 * サービスコンポーネントの実行結果からリターンコードを取得します。
	 * @param result サービスコンポーネント実行結果
	 * @return リターンコード
	 */
	public static Integer getReturnCode(Map<?, ?> result) {
		return JCNDslScParamHenshu.getReturnCode(result);
	}

	/**
	 * サービスコンポーネントの実行結果からステータスコードを取得します。
	 * @param result サービスコンポーネント実行結果
	 * @return ステータスコード
	 */
	public static Integer getStatus(Map<?, ?> result) {
		return JCNDslScParamHenshu.getStatus(result);
	}

	/**
	 * サービスコンポーネントの入力パラメータで指定がない項目にNULLを設定します。
	 * @param cbsMsgClass サービスコンポーネントCBSMsgクラス
	 * @param inMap サービスコンポーネント用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullColumnForScParam(Class<?> cbsMsgClass, Map inMap){
		JCNDslScParamHenshu.setNullOtherColumn(cbsMsgClass, inMap);
	}

	/**
	 * サービスコンポーネントの入力パラメータでブランク(空文字)が指定された項目にNULLを設定します。
	 * @param inMap サービスコンポーネント用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullBlankColumnForScParam(Map inMap){
		JCNDslScParamHenshu.setNullBlankColumn(inMap);
	}

	/**
	 * デバッグログを出力します。
	 * @param cls クラス
	 * @param debugMsg メッセージ
	 */
	@SuppressWarnings("unchecked")
	public static void printBpDebugLog(Class cls, String debugMsg){
		JSYbpmLog.println(JSYLogBase.DEBUG, cls , debugMsg, MessageID.DEB_X21_DEBUG_MSG,  new String[]{"", ""}, "");
	}

	/**
	 * オブジェクトのダンプログを出力します。
	 * @param cls クラス
	 * @param objName オブジェクト名
	 * @param dumpObj オブジェクト
	 */
	@SuppressWarnings("unchecked")
	public static void printBpDumpLog(Class cls, String objName, Object dumpObj){
		JSYbpmLog.println(JSYLogBase.Message_Dump, cls , dumpObj , MessageID.DEB_X21_DEBUG_MSG,  new String[]{"### オブジェクト", objName}, " ###");
	}

	/**
	 * ＢＰチェックスキップ用のパラメータを作成します。
	 * @return  ＢＰチェックスキップ用パラメータ
	 */
	public static HashMap<String, Object> createBpNotCheckParam(){
		return JCNDslScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集します。
	 * @param param リクエストパラメータ
	 * @param caanMsgs CAANメッセージリスト
	 * @param returnCode 
	 * @return ＢＰチェック結果
	 * @throws Throwable
	 */
	public static IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable{
		return JCNDslScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}

	/**
	 * リクエストパラメータに対象項目のエラー情報が有るか無いかを判定します。
	 * @param param リクエストパラメータ
	 * @param errFieldName エラー項目名
	 * @return エラー有無(true:エラー有り、false:エラー無し)
	 * @throws RequestParameterException
	 */
	public static boolean isErrorField(IRequestParameterReadWrite param, String errFieldName) throws RequestParameterException{
		return JCNDslScParamHenshu.isErrorField(param, errFieldName);
	}

	/**
	 * 年齢フラグ取得<br />
	 * @param birthday 生年月日
	 * @param opeDate 運用日付
	 * @return String 年齢フラグ
	 */
	public static String getAgeFlg(String birthday, String opeDate)
	{
		//運用日付を年（西暦）、月、日に分割
		int opeDateYear = Integer.parseInt(opeDate.substring(0, 4));
		int opeDateMonth = Integer.parseInt(opeDate.substring(4, 6));
		int opeDateDay = Integer.parseInt(opeDate.substring(6, 8));
		//年齢
		int nenrei = 0;
		//年齢フラグ（初期値を設定）
		String ageFlg = "";

		if(birthday == null || "".equals(birthday))
		{
			ageFlg = "0000";
			return ageFlg;
		}
		
		try
		{
			//生年月日を年（西暦）、月、日に分割
			int birthdayYear = Integer.parseInt(birthday.substring(0, 4));
			int birthdayMonth = Integer.parseInt(birthday.substring(4, 6));
			int birthdayDay = Integer.parseInt(birthday.substring(6, 8));

			//年齢の取得
			nenrei = opeDateYear - birthdayYear;
			if((birthdayMonth > opeDateMonth) || ((birthdayMonth == opeDateMonth) && (birthdayDay > opeDateDay)))
			{
				nenrei--;
			}
		}
		catch(NumberFormatException e)
		{
			ageFlg = "0000";
		}
		
		//年齢フラグの設定
		if("0000".equals(ageFlg))
		{
			
		}
		else if (nenrei < 12)
		{
			ageFlg = "1000";
		}
		else if(nenrei >= 12 && nenrei < 15)
		{
			ageFlg = "2000";
		}
		else if(nenrei >= 15 && nenrei < 18)
		{
			ageFlg = "3000";
		}
		else if(nenrei >= 18 && nenrei < 20)
		{
			ageFlg = "4000";
		}
		else if(nenrei >= 20 && nenrei < 21)
		{
			ageFlg = "5000";
		}
		else if(nenrei >= 21)
		{
			ageFlg = "6000";
		}

		return ageFlg;
	}

	/**
	 * 拗音-直音変換(PMP連携用)<br />
	 * <pre>対象文字列の拗音を直音文字に変換して返します。</pre>
	 * @param targetValue 対象文字列
	 * @return 変換後文字列
	 */
	public static String replaceYouonToChokuon(String targetValue)
	{
		// 引数の対象文字列がnullの場合
		if (targetValue == null)
		{
			// 空文字を返す
			return "";
		}

		for(int i = 0; i < PMP_KATAKANA_YOUON.length; i++)
		{
			targetValue = targetValue.replaceAll(PMP_KATAKANA_YOUON[i], PMP_KATAKANA_CHOKUON[i]);
		}
		
		// 変換後文字列を返す
		return targetValue;
	}

	/**
	 * 050アプリ利用端末種別取得部品<br />
	 * <pre>コンテンツ契約内訳にて保持している、端末利用環境情報から端末情報のみを返します。</pre>
	 * @param targetValue 対象文字列
	 * @return 変換後文字列
	 */
	public static String n_050apl_use_model_sbt_set(String targetValue)
	{
		// 引数の端末利用環境情報がnullの場合
		if (targetValue == null)
		{
			// 空文字を返す
			return "";
		}
		
		String tanmt_use_enb_info[] = targetValue.split(JCNStrConst.S_SEP_CAM);
		targetValue = tanmt_use_enb_info[0];
		
		// 変換後文字列を返す
		return targetValue;
	}
}
