/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JSCVLANOrderNoGenerator
*   ソースファイル名：JSCVLANOrderNoGenerator.java
*   作成者          ：富士通
*   日付            ：2012年11月20日
*＜機能概要＞
*   モバイルオーダ番号採番部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v3.00.00    2012/11/20   富士通      新規作成
*
**********************************************************************/
package eo.ejb.common.edit;

import java.util.concurrent.TimeoutException;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.constant.JSCStrConstant;
import eo.ejb.cbm.entity.SC0021ETMsg;
import eo.ejb.cbm.entity.SC0151ETMsg;
import eo.ejb.cbs.cbsmsg.ESC0021D010CBSMsg;

/**
 * VLANオーダ番号採番部品
 * @author 富士通
 *
 */
public class JSCVLANOrderNoGenerator
{

	/**
	 * <p>
	 * VLANオーダ番号を採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたVLANオーダ番号
	 */
	public static String getVLANOrderNo(CAANMsg inMsg, AgentDispatchContext inContext) 
	{
		String rtnOrderNo = null;
		
		//入力CAANメッセージにVLANオーダ番号が設定されている場合はそのまま返却
		if (inMsg.getString(ESC0021D010CBSMsg.TEL_VLAN_ORDER_NO) != null && !"".equals(inMsg.getString(ESC0021D010CBSMsg.TEL_VLAN_ORDER_NO)))
		{
			return inMsg.getString(ESC0021D010CBSMsg.TEL_VLAN_ORDER_NO);
		}

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (JSCCommonNoGenerator.isFuncMode(inMsg))
		{
			return " " ;
		}

		try
		{
			// 次オーダ番号採番
			rtnOrderNo = getNextOrderNo();
			
			// VLANオーダ存在確認
			existsVLANOrder(rtnOrderNo);
		}
		catch (TimeoutException te)
		{
			throw new RuntimeException(te);
		}
		catch (CAANException ce)
		{
			throw new RuntimeException(ce);
		}
		
		inMsg.set(ESC0021D010CBSMsg.TEL_VLAN_ORDER_NO, rtnOrderNo);
		return rtnOrderNo;

	}

	/**
	 * <p>
	 * 次VLANオーダ番号を採番します。
	 * </p>
	 * @return 採番されたVLANオーダ番号
	 * @throws TimeoutException
	 * @throws CAANException
	 */
	private static String getNextOrderNo() throws TimeoutException, CAANException
	{
		CAANMsg sc0151Msg = null;
		JSCVLANOrdSRInfoAccesser accObj = new JSCVLANOrdSRInfoAccesser();

		String nextSeq = null;
		String sodStat = null;
		boolean isContinue = true;
		int cnt = 0;
		
		while(isContinue)
		{
			// --- タイムアウト処理
			
			++cnt;
			if (cnt > JSCStrConstant.MAX_NEXT_SEQ_COUNT)
			{
				throw new TimeoutException();
			}
			
			// --- シーケンス取得
			
			nextSeq = JSCCommonNoGenerator.getFormatedNextSeq(JSCStrConstant.ORA_SEQ_TEL_VLAN_ORDER_NO, JSCStrConstant.ORDER_NO_LEN);
			
			// ---存在チェック
			
			// 条件設定
			sc0151Msg = new CAANMsg(SC0151ETMsg.class.getName());
			
			// 電話用ＶＬＡＮオーダ番号
			sc0151Msg.set(SC0151ETMsg.TEL_VLAN_ORDER_NO, nextSeq);
			
			sc0151Msg = accObj.findByPrimaryKey(sc0151Msg);
			
			// 結果が存在しない場合
			if (null == sc0151Msg)
			{
				break;
			}
			
			// ---検索結果の削除処理
			
			sodStat = sc0151Msg.getString(SC0151ETMsg.SOD_STAT);
			
			if (false == sodStat.equals(JSCStrConstant.SOD_STAT_ACK_NORMAL)
					&& false == sodStat.equals(JSCStrConstant.SOD_STAT_REAPPLIED)) 
			{
				continue;
			}
			
			accObj.removeOrder(sc0151Msg);
			break;
		}

		return nextSeq;
	}

	/**
	 * VLANオーダ存在確認
	 * 	存在する場合は削除する
	 * @param orderNo
	 * @throws CAANException
	 * @return boolean
	 */
	private static void existsVLANOrder(String orderNo) throws CAANException
	{
		CAANMsg sc0021InMsg = new CAANMsg(SC0021ETMsg.class.getName());
		JSCVLANOrderAccesser scVLANOrder = new JSCVLANOrderAccesser();
		sc0021InMsg.set(SC0021ETMsg.TEL_VLAN_ORDER_NO, orderNo);
		sc0021InMsg = scVLANOrder.findByPrimaryKey(sc0021InMsg);
		if (null == sc0021InMsg)
		{
			return;
		}
		scVLANOrder.removeOrder(sc0021InMsg);
	}

}
