/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEditUtil
*	ソースファイル名：JKKejbEditUtil.java
*	作成者			：富士通
*	日付			：2011年08月01日
*＜機能概要＞
*	開始日/課金開始日用編集共通クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/11	富士通		新規作成
*   v8.00.00	2014/03/04	FJ）松枝	ANK-1942-00-00
*
**********************************************************************/

package eo.ejb.common.edit;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;

import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0021LE;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0081LE;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0021DBABase;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;

/**
 * <p>
 * 開始日/課金開始日用の編集を行う共通編集クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEditUtil
{
	
	/** 状態遷移定義（解約）*/
	private static final String STATE_DSL = "910";

	/** 状態遷移定義（キャンセル）*/
	private static final String STATE_CANCEL = "920";
		
	/** 無効フラグ */
	private static final String MK_FLG_YUKO = "0";
	
	/**
	 * <p>
	 * 申込番号に紐付くサービス契約の全件を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param mskmNo 申込番号
	 * @return 取得したサービス契約の配列
	 */
	public CAANMsg[] getCurKK0081WithMskm(CAANMsg inMsg, String mskmNo)
	{
		
		// 申込番号をキーに申込明細を全件カレント検索する
		CAANMsg[] kk0021Msgs = getAllCurrentKK0021(inMsg, mskmNo);
		
		// サービス契約検索結果保持用リスト
		ArrayList<CAANMsg> kk0081List = new ArrayList<CAANMsg>();
		
		for(int i = 0; i < kk0021Msgs.length; i++)
		{
			// 取得結果の申込明細番号をキーにサービス契約を全件カレント検索する
			kk0081List.addAll(getAllCurrentKK0081(inMsg, kk0021Msgs[i].getString(KK0021ETMsg.MSKM_DTL_NO)));
		}

		// 全件カレント検索の結果をリストからCAANMsgの配列へ置換する
		CAANMsg[] kk0081Msgs = new CAANMsg[kk0081List.size()];
		
		for (int i = 0; i < kk0081List.size(); i++)
		{
			kk0081Msgs[i] = kk0081List.get(i);
		}

		return kk0081Msgs;

	}
	
	/**
	 * <p>
	 * 申込番号に紐付くオプションサービス契約の全件を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param mskmNo 申込番号
	 * @return 取得したオプションサービス契約の配列
	 */
	public CAANMsg[] getCurKK0351WithMskm(CAANMsg inMsg, String mskmNo)
	{
		
		// 申込番号をキーに申込明細を全件カレント検索する
		CAANMsg[] kk0021Msgs = getAllCurrentKK0021(inMsg, mskmNo);
		
		// サービス契約検索結果保持用リスト
		ArrayList<CAANMsg> kk0351List = new ArrayList<CAANMsg>();
		
		for(int i = 0; i < kk0021Msgs.length; i++)
		{
			// 取得結果の申込明細番号をキーにオプションサービス契約を全件カレント検索する
			kk0351List.addAll(getAllCurrentKK0351(inMsg, kk0021Msgs[i].getString(KK0021ETMsg.MSKM_DTL_NO)));
		}
		
		return kk0351List.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * 申込番号に紐付く申込明細の全件カレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmNo 申込番号
	 * @return 検索結果のレコード配列
	 */
	private CAANMsg[] getAllCurrentKK0021(CAANMsg inCBSMsg, String mskmNo)
	{
		// 全件検索用のメッセージを作成
		CAANMsg inETMsgCnd = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsgCnd.set(KK0021ETMsg.MSKM_NO, mskmNo);
		inETMsgCnd.set(KK0021ETMsg.MK_FLG, MK_FLG_YUKO);

		// 申込明細の全件検索を行う
		CAANMsg[] ret0021Cnd = null;

		try
		{
			ret0021Cnd = new KK0021LE().findByCondition(inETMsgCnd);
		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// カレント取得結果の保持用リスト
		ArrayList<CAANMsg> array = new ArrayList<CAANMsg>();

		// 処理済キー保持用HashMap
		HashMap<String, String> hash = new HashMap<String, String>();
		
		// 申込明細の取得件数分処理を行う
		for (int i = 0; i < ret0021Cnd.length; i++)
		{
			// 申込明細番号の取得
			String mskmDtlNo = ret0021Cnd[i].getString(KK0021ETMsg.MSKM_DTL_NO);
			
			// 処理済の申込明細番号は処理しない
			if (hash.containsKey(mskmDtlNo))
			{
				continue;
			}

			// 処理済の申込明細番号をHashMapに保持する
			hash.put(mskmDtlNo, mskmDtlNo);
			
			// 対象の申込明細番号でカレント検索を行う
			CAANMsg kk0021 = getCurrentKK0021(inCBSMsg, mskmDtlNo);
			
			// 取得できない場合は、次のレコードへ
			if(null == kk0021)
			{
				continue;
			}
			
			// キャンセル済は対象外
			if(STATE_CANCEL.equals(kk0021.getString(KK0021ETMsg.MSKM_DTL_STAT)))
			{
				continue;
			}

			array.add(kk0021);

		}
		
		// カレント検索の結果をリストからCAANMsgの配列へ置換する
		CAANMsg[] retMsg = new CAANMsg[array.size()];

		for (int i = 0; i < array.size(); i++)
		{
			retMsg[i] = array.get(i);
		}

		return retMsg;
	}
		
	/**
	 * <p>
	 * サービス契約に紐付くサービス契約の全件カレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmDtlNo 申込明細番号
	 * @return 検索結果のレコードリスト
	 */
	private ArrayList<CAANMsg> getAllCurrentKK0081(CAANMsg inCBSMsg, String mskmDtlNo)
	{
		// 全件検索用のメッセージを作成
		CAANMsg inETMsgCnd = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsgCnd.set(KK0081ETMsg.MSKM_DTL_NO, mskmDtlNo);
		inETMsgCnd.set(KK0081ETMsg.MK_FLG, MK_FLG_YUKO);

		// サービス契約の全件検索を行う
		CAANMsg[] ret0081Cnd = null;

		try
		{
			ret0081Cnd = new KK0081LE().findByCondition(inETMsgCnd);
		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// カレント取得結果の保持用リスト
		ArrayList<CAANMsg> array = new ArrayList<CAANMsg>();

		// 処理済キー保持用HashMap
		HashMap<String, String> hash = new HashMap<String, String>();
		
		// サービス契約の取得件数分処理を行う
		for (int i = 0; i < ret0081Cnd.length; i++)
		{
			// サービス契約番号の取得
			String svcKeiNo = ret0081Cnd[i].getString(KK0081ETMsg.SVC_KEI_NO);
			
			// 処理済のサービス契約番号は処理しない
			if (hash.containsKey(svcKeiNo))
			{
				continue;
			}

			// 処理済のサービス契約番号をHashMapに保持する
			hash.put(svcKeiNo, svcKeiNo);
			
			// 対象の申込明細番号でカレント検索を行う
			CAANMsg kk0081 = getCurrentKK0081(inCBSMsg, svcKeiNo);
			
			// 取得できない場合は、次のレコードへ
			if(null == kk0081)
			{
				continue;
			}

			// 解約済・キャンセル済は対象外
			if(STATE_DSL.equals(kk0081.getString(KK0081ETMsg.SVC_KEI_STAT)) 
					|| STATE_CANCEL.equals(kk0081.getString(KK0081ETMsg.SVC_KEI_STAT)))
			{
				continue;
			}
			
			// 対象のサービス契約でカレント検索を行う
			array.add(kk0081);
		}
		
		return array;
	}
	
	/**
	 * <p>
	 * 申込明細番号に紐付くオプションサービス契約の全件カレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmDtlNo 申込明細番号
	 * @return 検索結果のレコードリスト
	 */
	private ArrayList<CAANMsg> getAllCurrentKK0351(CAANMsg inCBSMsg, String mskmDtlNo)
	{
		// 全件検索用のメッセージを作成
		CAANMsg inETMsgCnd = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsgCnd.set(KK0351ETMsg.MSKM_DTL_NO, mskmDtlNo);
		inETMsgCnd.set(KK0351ETMsg.MK_FLG, MK_FLG_YUKO);
		
		// オプションサービス契約の全件検索を行う
		CAANMsg[] ret0351Cnd = null;
		
		try
		{
			ret0351Cnd = new KK0351LE().findByCondition(inETMsgCnd);
		}
		catch(CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// カレント取得結果の保持用リスト
		ArrayList<CAANMsg> array = new ArrayList<CAANMsg>();
		
		// 処理済キー保持用HashMap
		HashMap<String, String> hash = new HashMap<String, String>();
		
		// オプションサービス契約の取得件数分処理を行う
		for (int i = 0; i < ret0351Cnd.length; i++)
		{
			// オプションサービス契約番号の取得
			String opSvcKeiNo = ret0351Cnd[i].getString(KK0351ETMsg.OP_SVC_KEI_NO);
			
			// 処理済のオプションサービス契約番号は処理しない
			if (hash.containsKey(opSvcKeiNo))
			{
				continue;
			}
			
			// 処理済のオプションサービス契約番号をHashMapに保持する
			hash.put(opSvcKeiNo, opSvcKeiNo);
			
			// 対象のオプションサービス契約番号でカレント検索を行う
			CAANMsg kk0351 = getCurrentKK0351(inCBSMsg, opSvcKeiNo);
			
			// 取得できない場合は、次のレコードへ
			if(null == kk0351)
			{
				continue;
			}
			
			String opSvcKeiStat = kk0351.getString(KK0351ETMsg.OP_SVC_KEI_STAT);
			
			// 解約済・キャンセル済は対象外
			if (STATE_DSL.equals(opSvcKeiStat))
			{
				continue;
			}
			if (STATE_CANCEL.equals(opSvcKeiStat))
			{
				continue;
			}
			
			// 対象のオプションサービス契約をリストに保持する
			array.add(kk0351);
		}
		
		return array;
	}
	
	/**
	 * <p>
	 * 申込明細のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmDtlNo 申込明細番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0021(CAANMsg inCBSMsg, String mskmDtlNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);

		// 申込明細のカレント検索を行う
		return new JKKejbKK0021DBABase().findByCurrent(inETMsg);
	}
	
	/**
	 * <p>
	 * サービス契約のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0081(CAANMsg inCBSMsg, String svcKeiNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約のカレント検索を行う
		return new JKKejbKK0081DBABase().findByCurrent(inETMsg);
			
	}

	/**
	 * <p>
	 * オプションサービス契約のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0351(CAANMsg inCBSMsg, String opSvcKeiNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		
		// サービス契約のカレント検索を行う
		return new JKKejbKK0351DBABase().findByCurrent(inETMsg);
	}
	
	/**
	 * ゼロ埋め（左）を行う
	 * @param value
	 * @param len
	 * @return String
	 */
	static String setzero(String value, int len)
	{
		if(value == null)
		{
			return value;
		}
		String tmp = value;
		String zero = "0";
		
		while(tmp.length() < len)
		{
			tmp = zero + tmp;
		}
		
		return tmp;
	}
}
