/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKSvcKeiCommon
 *	ソースファイル名：JKKSvcKeiCommon.java
 *	作成者			：FJ
 *	日付			：2012年04月19日
 *＜機能概要＞
 *	契約システムの共通処理クラスです。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00		2013/07/03	FJ			新規作成
 *
 **********************************************************************/
package eo.common.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.common.constant.JKKStrConst;

/**
 * 契約システム共通処理
 * <BR>
 * @author 富士通
 */
public class JKKSvcKeiCommon extends JPCUtilCommon
{
	// 空文字
	private static final String STR_EMPTY = "";

	/*****************************************************************************/
	/** ソート系メソッド ＳＴＡＲＴ                                             **/
	/*****************************************************************************/
	public List<Map<String, String>> exeSortList(Map<String, Object> dataMap, List<Map<String, String>> targetList, String sortKey)
	{
		// リストが空の場合
		if (targetList == null || targetList.size() == 0)
		{
			return targetList;
		}

		// ソートキーが設定されていない場合
		if (sortKey == null || STR_EMPTY.equals(sortKey))
		{
			return targetList;
		}

		comparator comp = new comparator();

		// 指定されたソートキーを第一キーにセット
		comp.setSortKey(sortKey);
		Collections.sort(targetList, comp);

		return targetList;
	}
	/*****************************************************************************/
	/** ソート系メソッド ＥＮＤ                                                 **/
	/*****************************************************************************/

	/*****************************************************************************/
	/** 同番移転系定数 ＳＴＡＲＴ                                               **/
	/*****************************************************************************/
	/**
	 * 同番移転ステータスの値から導く項目<br>
	 * 「同番移転連携登録状況コード」「同番移転判定コード」を<br>
	 * 同番移転ステータスと紐付けている配列です。<br>
	 * ※同番移転依頼制御コードが連携の場合の配列です。<br>
	 */
	private static final String DOBAN_ITN_RNKI_ARRAY[][] = {
			{STR_EMPTY,                                  JKKStrConst.CD01281_MISETTE, JKKStrConst.CD01432_MIRNKI},
			{JKKStrConst.CD00432_DOBAN_STAT_NTTSENDSTAY, JKKStrConst.CD01281_MISETTE, JKKStrConst.CD01432_MIRNKI},
			{JKKStrConst.CD00432_DOBAN_STAT_NTTSENDZUMI, JKKStrConst.CD01281_MISETTE, JKKStrConst.CD01432_RNKIZM},
			{JKKStrConst.CD00432_DOBANITEN_RSLT_FAIL,    JKKStrConst.CD01281_HI,      JKKStrConst.CD01432_RNKIZM},
			{JKKStrConst.CD00432_DOBANITEN_RSLT_PSB,     JKKStrConst.CD01281_KA,      JKKStrConst.CD01432_RNKIZM},
			{JKKStrConst.CD00432_DOBANITEN_FIN,          JKKStrConst.CD01281_KA,      JKKStrConst.CD01432_RNKIZM},
			{JKKStrConst.CD00432_DOBANITEN_CANCEL,       STR_EMPTY,                   STR_EMPTY},
	};

	/**
	 * 同番移転ステータスの値から導く項目<br>
	 * 「同番移転連携登録状況コード」「同番移転判定コード」を<br>
	 * 同番移転ステータスと紐付けている配列です。<br>
	 * ※同番移転依頼制御コードが連携以外の場合の配列です。<br>
	 */
	private static final String DOBAN_ITN_MIRNKI_ARRAY[][] = {
			{JKKStrConst.CD01425_DOBAN_REQ_HORYU,        JKKStrConst.CD01281_MISETTE, JKKStrConst.CD01432_MIRNKI},
			{JKKStrConst.CD01425_DOBAN_REQ_RENKEIFUYO,   JKKStrConst.CD01281_MISETTE, JKKStrConst.CD01432_MIRNKI},
	};

	/**
	 * 同番移転ステータスの値から導く項目<br>
	 * 「同番移転連携登録状況コード」「同番移転判定コード」を<br>
	 * 同番移転ステータスと紐付けている配列です。<br>
	 * ※同番移転ステータスが空の場合の配列です。<br>
	 */
	private static final String DOBAN_ITN_RNKI_ANOTHER_ARRAY[][] = {
			{STR_EMPTY,                                  STR_EMPTY,                   STR_EMPTY},
	};

	/*****************************************************************************/
	/** 同番移転系定数 ＥＮＤ                                                   **/
	/*****************************************************************************/

	/*****************************************************************************/
	/** 同番移転系メソッド ＳＴＡＲＴ                                           **/
	/*****************************************************************************/
	/**
	 * 同番移転ステータスから、「同番移転連携登録状況コード」を確定して返却します。<br>
	 * <br>
	 * @param	dobanItnStat		同番移転ステータス
	 * @return	String				同番移転連携登録状況コード
	 */
	public String getDobanItnTorokuJyokyoCd(String dobanItnStat, String dobanItnReqCtrlCd)
	{
		return getDobanItnInfoCmn(dobanItnStat, dobanItnReqCtrlCd, 2);
	}

	/**
	 * 同番移転ステータスから、「同番移転判定コード」を確定して返却します。<br>
	 * <br>
	 * @param	dobanItnStat		同番移転ステータス
	 * @return	String				同番移転判定コード
	 */
	public String getDobanItnJudgeCd(String dobanItnStat, String dobanItnReqCtrlCd)
	{
		return getDobanItnInfoCmn(dobanItnStat, dobanItnReqCtrlCd, 1);
	}

	/**
	 * 同番移転ステータスから、導く項目を確定して返却します。<br>
	 * <br>
	 * @param	dobanItnStat		同番移転ステータス
	 * @param	getColumnIndex		導く項目の列番号
	 * @return	String				導く項目の値
	 */
	private String getDobanItnInfoCmn(String dobanItnStat, String dobanItnReqCtrlCd, int getColumnIndex)
	{
		// 返却値
		String ret = STR_EMPTY;

		// 同番移転依頼制御コードが空の場合
		if (dobanItnReqCtrlCd == null || STR_EMPTY.equals(dobanItnReqCtrlCd))
		{
			// 同番移転ステータスが空の場合
			if (dobanItnStat == null || STR_EMPTY.equals(dobanItnStat))
			{
				return DOBAN_ITN_RNKI_ANOTHER_ARRAY[0][getColumnIndex];
			}
		}

		// 配列数分、処理を繰り返します。
		for (int i = 0; i < DOBAN_ITN_MIRNKI_ARRAY.length; i++)
		{
			// 同番移転依頼制御コードが一致する場合
			if (DOBAN_ITN_MIRNKI_ARRAY[i][0].equals(dobanItnReqCtrlCd))
			{
				// 情報を取得します。
				return DOBAN_ITN_MIRNKI_ARRAY[i][getColumnIndex];
			}
		}

		// 配列数分、処理を繰り返します。
		for (int i = 0; i < DOBAN_ITN_RNKI_ARRAY.length; i++)
		{
			// 同番移転ステータスが一致する場合
			if (DOBAN_ITN_RNKI_ARRAY[i][0].equals(dobanItnStat))
			{
				// 情報を取得します。
				ret = DOBAN_ITN_RNKI_ARRAY[i][getColumnIndex];
				break;
			}
		}

		return ret;
	}

	/**
	 * 同番移転連携登録状況コードから、コード名称を返却します。<br>
	 * <br>
	 * @param	dobanItnTorokuJyokyoCd	同番移転連携登録状況コード
	 * @param	outputMap				出力マップ
	 * @param	outputMapKey			出力マップキー
	 * @return	String					コード名称
	 */
	public String getDobanItnTorokuJyokyoCdNm(String dobanItnTorokuJyokyoCd, HashMap outputMap, String outputMapKey)
	{
		return getDobanItnCdNmCmn(dobanItnTorokuJyokyoCd, outputMap, outputMapKey);
	}

	/**
	 * 同番移転判定コードから、コード名称を返却します。<br>
	 * <br>
	 * @param	dobanItnJudgeCd			同番移転判定コード
	 * @param	outputMap				出力マップ
	 * @param	outputMapKey			出力マップキー
	 * @return	String					コード名称
	 */
	public String getDobanItnJudgeCdNm(String dobanItnJudgeCd, HashMap outputMap, String outputMapKey)
	{
		return getDobanItnCdNmCmn(dobanItnJudgeCd, outputMap, outputMapKey);
	}

	/**
	 * 各同番移転コードから、コード名称を返却します。<br>
	 * <br>
	 * @param	targetDobanItnCd		対象の同番移転コード
	 * @param	outputMap				出力マップ
	 * @param	outputMapKey			出力マップキー
	 * @return	String					コード名称
	 */
	private String getDobanItnCdNmCmn(String targetDobanItnCd, HashMap outputMap, String outputMapKey)
	{
		// 返却値
		String ret = STR_EMPTY;

		// 出力マップに対象のキーが存在しない場合
		if(! outputMap.containsKey(outputMapKey))
		{
			return STR_EMPTY;
		}

		// 対象の同番移転コードが空の場合
		if (targetDobanItnCd == null || STR_EMPTY.equals(targetDobanItnCd))
		{
			return STR_EMPTY;
		}

		// コード名称管理明細のキー
		String EZM0171B010CBSMsg1List = "EZM0171B010CBSMsg1List";
		// コード区分のキー
		String cdDivKey               = "cd_div";
		// コード区分名のキー
		String cdDivNmKey             = "cd_div_nm";

		// 出力情報を取得します。
		HashMap parentMap = (HashMap)outputMap.get(outputMapKey);

		if(parentMap.containsKey(EZM0171B010CBSMsg1List))
		{
			// コード名称管理明細を取得します。
			ArrayList childList = (ArrayList)parentMap.get(EZM0171B010CBSMsg1List);

			for(int i = 0; i < childList.size(); i++)
			{
				// 明細を１行取得します。
				HashMap childMap = (HashMap)childList.get(i);

				// コード区分を取得します。
				String cdDiv = (String)childMap.get(cdDivKey);

				// 区分が一致する場合
				if (cdDiv.equals(targetDobanItnCd))
				{
					// コード区分名を取得します。
					ret = (String)childMap.get(cdDivNmKey);
					break;
				}
			}
		}

		return ret;
	}
	/*****************************************************************************/
	/** 同番移転系メソッド ＥＮＤ                                               **/
	/*****************************************************************************/
}

class comparator implements Comparator<Map<String, String>>
{

	/** 昇順フラグ */
	private boolean isAsc = true;

	/** サブ昇順フラグ */
	private boolean isSubAsc = true;

	/** ソートの基準となるキー */
	private String sortKey = "";

	/** ソートの基準となるサブキー */
	private String sortSubKey = "";

	/**
	 * 順序付けのために 2 つの引数を比較します。<br>
	 * <br>
	 * @param	o1		比較対象の最初のオブジェクト
	 * @param	o2		比較対象の２番目のオブジェクト
	 * @return	int		最初の引数が２番目の引数より小さい場合　⇒　負の整数<br>
	 * 					両方が等しい場合　　　　　　　　　　　　⇒　0<br>
	 * 					最初の引数が２番目の引数より大きい場合　⇒　正の整数<br>
	 */
	@Override
	public int compare(Map<String, String> o1, Map<String, String> o2)
	{
		if (o1.get(this.getSortKey()).compareTo(o2.get(this.getSortKey())) == 0)
		{
			if (this.getSortSubKey() == null || "".equals(this.getSortSubKey()))
			{
				return 0;
			}

			else
			{
				if (o1.get(this.getSortSubKey()).compareTo(o2.get(this.getSortSubKey())) == 0)
				{
					return 0;
				}
				else if (o1.get(this.getSortSubKey()).compareTo(o2.get(this.getSortSubKey())) > 0)
				{
					return isSubAsc ? 1 : -1;
				}

				else if (o1.get(this.getSortSubKey()).compareTo(o2.get(this.getSortSubKey())) < 0)
				{
					return isSubAsc ? -1 : 1;
				}
			}

		}
		else if (o1.get(this.getSortKey()).compareTo(o2.get(this.getSortKey())) > 0)
		{
			return isAsc ? 1 : -1;
		}

		else if (o1.get(this.getSortKey()).compareTo(o2.get(this.getSortKey())) < 0)
		{
			return isAsc ? -1 : 1;
		}

		return 0;
	}

	/**
	 * ソートキーを取得します。<br>
	 * <br>
	 * @param			なし
	 * @return			ソートキー
	 */
	public String getSortKey()
	{
		return sortKey;
	}

	/**
	 * サブソートキーを取得します。<br>
	 * <br>
	 * @param			なし
	 * @return			サブソートキー
	 */
	public String getSortSubKey()
	{
		return sortSubKey;
	}

	/**
	 * ソートキーを設定します。<br>
	 * <br>
	 * @param	key		ソートキー
	 * @return			なし
	 */
	public void setSortKey(String key)
	{
		if (key.indexOf("_desc") > 0)
		{
			this.isAsc = false;
		}

		this.sortKey = key.replaceAll("_desc", "").replaceAll("_asc", "");
	}

	/**
	 * サブソートキーを設定します。<br>
	 * <br>
	 * @param	key		サブソートキー
	 * @return			なし
	 */
	public void setSortSubKey(String key)
	{
		if (key.indexOf("_desc") > 0)
		{
			this.isSubAsc = false;
		}

		this.sortSubKey = key.replaceAll("_desc", "").replaceAll("_asc", "");
	}
}