/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSCBatMobileOrderNoGenerator
*	ソースファイル名：JSCBatMobileOrderNoGenerator.java
*	作成者			：富士通
*	日付			：2012年09月15日
*＜機能概要＞
*	モバイルオーダー番号採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/09/15	FJ			新規作成
*
**********************************************************************/
package eo.business.common;

import java.util.ArrayList;
import java.util.List;

import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;

import eo.business.util.table.JBSbatSC_T_EM_ODR_SRINF;
import eo.business.util.table.JBSbatSC_T_MOBILE_ORDER;
import eo.business.util.table.JBSbatSC_T_SPOT_ODR_SRINF;
import eo.business.util.table.JBSbatSC_T_UQ_ODR_SRINF;
import eo.common.constant.JSCStrConstant;
import eo.common.util.JPCUtilCommon;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;

/**
 * <p>
 * モバイルオーダー番号採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JSCBatMobileOrderNoGenerator {
	
	
	/** SQL定義キー(SC_SELECT_012)*/
	private static final String SC_T_EM_ODR_SRINF_SC_SELECT_012 = "SC_SELECT_012";
	/** SQL定義キー(SC_SELECT_004)*/
	private static final String SC_T_SPOT_ODR_SRINF_SC_SELECT_004 = "SC_SELECT_004";
	/** SQL定義キー(SC_SELECT_003)*/
	private static final String SC_T_UQ_ODR_SRINF_SC_SELECT_003 = "SC_SELECT_003";
	
	/**
	 *  モバイルオーダ番号を採番します。
	 * @param commonItem		バッチ共通パラメータ電文
	 * @param uqOrderObj		テーブルアクセスクラス(ＵＱオーダ送受信情報)
	 * @param spotOrderObj		テーブルアクセスクラス(ＳＰＯＴオーダ送受信情報)
	 * @param emOrderObj		テーブルアクセスクラス(ＥＭオーダ送受信情報)
	 * @param mobileOrderObj	テーブルアクセスクラス(モバイルオーダ送受信情報)
	 * @return	採番されたモバイルオーダ番号
	 * @throws Exception
	 */
	public static String getMobileOrderNo(
			JBSbatCommonItem commonItem,
			JBSbatSQLAccess uqOrderObj,
			JBSbatSQLAccess spotOrderObj,
			JBSbatSQLAccess emOrderObj,
			JBSbatSQLAccess mobileOrderObj) throws Exception
	{
		String rtnMobileOrderNo = null;

		//モバイルオーダ番号採番
		rtnMobileOrderNo = getNextMobileOrderNo(commonItem, uqOrderObj, spotOrderObj, emOrderObj);

		//モバイルサービスオーダ存在確認
		existsMobileOrder(rtnMobileOrderNo, mobileOrderObj);

		//ゼロ詰め編集
		rtnMobileOrderNo = JPCUtilCommon.fillZero(rtnMobileOrderNo, JSCStrConstant.ORDER_NO_LEN, false);

		return rtnMobileOrderNo;
	}

	/**
	 * 次モバイルオーダ番号を採番します。
	 * @param commonItem		バッチ共通パラメータ電文
	 * @param uqOrderObj		テーブルアクセスクラス(ＵＱオーダ送受信情報)
	 * @param spotOrderObj		テーブルアクセスクラス(ＳＰＯＴオーダ送受信情報)
	 * @param emOrderObj		テーブルアクセスクラス(ＥＭオーダ送受信情報)
	 * @return	採番されたモバイルオーダ番号
	 */
	private static String getNextMobileOrderNo(JBSbatCommonItem commonItem, JBSbatSQLAccess uqOrderObj, JBSbatSQLAccess spotOrderObj, JBSbatSQLAccess emOrderObj)
	{
		String nextSeq = null;
		boolean isContinue = true;
		int cnt = 0;

		try
		{
			//利用可能なオーダ番号を取得できるまで継続
			while (isContinue) 
			{
				//最大継続回数を過ぎた場合はTimeOutExceptionをThrow
				if (cnt >= JSCStrConstant.MAX_NEXT_SEQ_COUNT) 
				{
					throw new TimeoutException();
				}
	
				//次シーケンスを取得
				nextSeq = JCCBatCommon.getNextSeq(commonItem, JSCStrConstant.ORA_SEQ_MOBILE_ORDER_NO);
				nextSeq = JPCUtilCommon.fillZero(nextSeq, JSCStrConstant.ORDER_NO_LEN, false);
				
				//UQサービスオーダ残存確認
				if (isRestUQOrder(nextSeq, uqOrderObj)) 
				{ 
					continue; 
				}
				//SPOTサービスオーダ残存確認
				if (isRestSpotOrder(nextSeq, spotOrderObj)) 
				{ 
					continue; 
				}
				//EMサービスオーダ残存確認
				if (isRestEMOrder(nextSeq, emOrderObj)) 
				{ 
					continue; 
				}
	
				isContinue = false;
				cnt++;
			}
		}
		catch (Exception e)
		{
			throw new RuntimeException();
		}

		return nextSeq;
	}

	/**
	 * UQオーダ残存確認
	 * 	残存する場合は削除する
	 * @param orderNo		採番されたモバイルオーダ番号
	 * @param uqOrderObj	テーブルアクセスクラス(ＵＱオーダ送受信情報)
	 * @return	残存確認結果
	 * @throws Exception
	 */
	private static boolean isRestUQOrder(String orderNo, JBSbatSQLAccess uqOrderObj) throws Exception
	{
		
		// 条件のマップを作成します	
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(orderNo);
		
		uqOrderObj.selectBySqlDefine(whereMap, SC_T_UQ_ODR_SRINF_SC_SELECT_003);
		
		List<JBSbatCommonDBInterface> resultList = new ArrayList<JBSbatCommonDBInterface>();
		
		JBSbatCommonDBInterface result = uqOrderObj.selectNext();
		while (null != result)
		{
			resultList.add(result);
			result = uqOrderObj.selectNext();
		}
		
		for (int i = 0; i < resultList.size(); ++i)
		{
			String sodStat = resultList.get(i).getString(JBSbatSC_T_UQ_ODR_SRINF.SOD_STAT);
			
			if (!(JSCStrConstant.SOD_STAT_ACK_NORMAL.equals(sodStat)
					|| JSCStrConstant.SOD_STAT_REAPPLIED.equals(sodStat))) 
			{
				return true;
			}
		}
		
		for (int i = 0; i < resultList.size(); ++i)
		{
			whereMap = new JBSbatCommonDBInterface();
			whereMap.setValue(JBSbatSC_T_UQ_ODR_SRINF.SRINF_KANRI_NO, resultList.get(i).getString(JBSbatSC_T_UQ_ODR_SRINF.SRINF_KANRI_NO));
			
			uqOrderObj.deleteByPrimaryKeys(whereMap);
		}
		return false;
		
//		CAANMsg sc0111InMsg = new CAANMsg(SC0111ETMsg.class.getName());
//		CAANMsg[] sc0111OutMsgs = null;
//
//		JSCUQOrdSRInfoAccesser scUQOrder = new JSCUQOrdSRInfoAccesser();
//		try 
//		{
//			sc0111InMsg.set(SC0111ETMsg.SOD_RENKEI_SEQ, orderNo);
//			sc0111OutMsgs = scUQOrder.findByCondition(sc0111InMsg);
//			//応答正常、再送依頼済
//			boolean isRest = false;
//			for (int i=0; i<sc0111OutMsgs.length; i++ )
//			{
//				String sodStat = sc0111OutMsgs[i].getString(SC0111ETMsg.SOD_STAT);
//				if (!(sodStat.equals(JSCStrConstant.SOD_STAT_ACK_NORMAL)
//					|| sodStat.equals(JSCStrConstant.SOD_STAT_REAPPLIED))) 
//				{
//						return true;
//				}
//			}
//			//全て処理完了していれば該当SEQの情報を全削除
//			if (!isRest) 
//			{
//				for (int i=0; i<sc0111OutMsgs.length; i++) 
//				{
//					scUQOrder.removeOrder(sc0111OutMsgs[i]);
//				}
//			}
//			return isRest;
//		} 
//		catch (CAANException ce) 
//		{
//			return false;
//		}
	}

	/**
	 * SPOTオーダ残存確認
	 * 	残存する場合は削除する
	 * @param orderNo		採番されたモバイルオーダ番号
	 * @param spotOrderObj	テーブルアクセスクラス(ＳＰＯＴオーダ送受信情報)
	 * @return	残存確認結果
	 */
	private static boolean isRestSpotOrder(String orderNo, JBSbatSQLAccess spotOrderObj) throws Exception
	{
		
		// 条件のマップを作成します	
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(orderNo);
		
		spotOrderObj.selectBySqlDefine(whereMap, SC_T_SPOT_ODR_SRINF_SC_SELECT_004);
		
		List<JBSbatCommonDBInterface> resultList = new ArrayList<JBSbatCommonDBInterface>();
		
		JBSbatCommonDBInterface result = spotOrderObj.selectNext();
		while (null != result)
		{
			resultList.add(result);
			result = spotOrderObj.selectNext();
		}
		
		for (int i = 0; i < resultList.size(); ++i)
		{
			String sodStat = resultList.get(i).getString(JBSbatSC_T_SPOT_ODR_SRINF.SOD_STAT);
			
			if (!(JSCStrConstant.SOD_STAT_ACK_NORMAL.equals(sodStat)
					|| JSCStrConstant.SOD_STAT_REAPPLIED.equals(sodStat))) 
			{
				return true;
			}
		}
		
		for (int i = 0; i < resultList.size(); ++i)
		{
			whereMap = new JBSbatCommonDBInterface();
			whereMap.setValue(JBSbatSC_T_SPOT_ODR_SRINF.SRINF_KANRI_NO, resultList.get(i).getString(JBSbatSC_T_SPOT_ODR_SRINF.SRINF_KANRI_NO));
			
			spotOrderObj.deleteByPrimaryKeys(whereMap);
		}
		return false;
		
		
//		CAANMsg sc0121InMsg = new CAANMsg(SC0121ETMsg.class.getName());
//		CAANMsg[] sc0121OutMsgs = null;
//
//		JSCSpotOrdSRInfoAccesser scSpotOrder = new JSCSpotOrdSRInfoAccesser();
//		try 
//		{
//			sc0121InMsg.set(SC0121ETMsg.SOD_RENKEI_SEQ, orderNo);
//			sc0121OutMsgs = scSpotOrder.findByCondition(sc0121InMsg);
//			//応答正常、再送依頼済
//			boolean isRest = false;
//			for (int i=0; i<sc0121OutMsgs.length; i++ )
//			{
//				String sodStat = sc0121OutMsgs[i].getString(SC0121ETMsg.SOD_STAT);
//				if (!(sodStat.equals(JSCStrConstant.SOD_STAT_ACK_NORMAL)
//					|| sodStat.equals(JSCStrConstant.SOD_STAT_REAPPLIED))) 
//				{
//						return true;
//				}
//			}
//			//全て処理完了していれば該当SEQの情報を全削除
//			if (!isRest) 
//			{
//				for (int i=0; i<sc0121OutMsgs.length; i++) 
//				{
//					scSpotOrder.removeOrder(sc0121OutMsgs[i]);
//				}
//			}
//			return isRest;
//		} 
//		catch (CAANException ce) 
//		{
//			return false;
//		}
	}

	/**
	 * EMオーダ残存確認
	 * 	残存する場合は削除する
	 * @param orderNo		採番されたモバイルオーダ番号
	 * @param spotOrderObj	テーブルアクセスクラス(ＥＭオーダ送受信情報)
	 * @return	残存確認結果
	 */
	private static boolean isRestEMOrder(String orderNo, JBSbatSQLAccess emOrderObj) throws Exception
	{
		
		// 条件のマップを作成します	
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(orderNo);
		
		emOrderObj.selectBySqlDefine(whereMap, SC_T_EM_ODR_SRINF_SC_SELECT_012); 
		
		List<JBSbatCommonDBInterface> resultList = new ArrayList<JBSbatCommonDBInterface>();
		
		JBSbatCommonDBInterface result = emOrderObj.selectNext();
		while (null != result)
		{
			resultList.add(result);
			result = emOrderObj.selectNext();
		}
		
		for (int i = 0; i < resultList.size(); ++i)
		{
			String sodStat = resultList.get(i).getString(JBSbatSC_T_EM_ODR_SRINF.SOD_STAT);
			
			if (!(JSCStrConstant.SOD_STAT_ACK_NORMAL.equals(sodStat)
					|| JSCStrConstant.SOD_STAT_REAPPLIED.equals(sodStat))) 
			{
				return true;
			}
		}
		
		for (int i = 0; i < resultList.size(); ++i)
		{
			whereMap = new JBSbatCommonDBInterface();
			whereMap.setValue(JBSbatSC_T_EM_ODR_SRINF.SRINF_KANRI_NO, resultList.get(i).getString(JBSbatSC_T_EM_ODR_SRINF.SRINF_KANRI_NO));
			
			emOrderObj.deleteByPrimaryKeys(whereMap);
		}
		return false;
		
//		CAANMsg sc0131InMsg = new CAANMsg(SC0131ETMsg.class.getName());
//		CAANMsg[] sc0131OutMsgs = null;
//
//		JSCEMOrdSRInfoAccesser scEMOrder = new JSCEMOrdSRInfoAccesser();
//		try 
//		{
//			sc0131InMsg.set(SC0111ETMsg.SOD_RENKEI_SEQ, orderNo);
//			sc0131OutMsgs = scEMOrder.findByCondition(sc0131InMsg);
//			//応答正常、再送依頼済
//			boolean isRest = false;
//			for (int i=0; i<sc0131OutMsgs.length; i++ )
//			{
//				String sodStat = sc0131OutMsgs[i].getString(SC0131ETMsg.SOD_STAT);
//				if (!(JSCStrConstant.SOD_STAT_ACK_NORMAL.equals(sodStat)
//					|| JSCStrConstant.SOD_STAT_REAPPLIED.equals(sodStat))) 
//				{
//						return true;
//				}
//			}
//			//全て処理完了していれば該当SEQの情報を全削除
//			if (!isRest) 
//			{
//				for (int i=0; i<sc0131OutMsgs.length; i++) 
//				{
//					scEMOrder.removeOrder(sc0131OutMsgs[i]);
//				}
//			}
//			return isRest;
//		} 
//		catch (Exception ce) 
//		{
//			return false;
//		}
	}

	/**
	 * モバイルオーダ存在確認
	 * 	存在する場合は削除する
	 * @param orderNo		採番されたモバイルオーダ番号
	 * @param mobileOrderObj	テーブルアクセスクラス(モバイルオーダ送受信情報)
	 * @return	存在確認結果
	 */
	private static void existsMobileOrder(String orderNo, JBSbatSQLAccess mobileOrderObj) throws Exception
	{
		
		// 条件のマップを作成します	
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		
		// PK検索を実行する
		whereMap.setValue(JBSbatSC_T_MOBILE_ORDER.MOBILE_ORDER_NO, orderNo);
		JBSbatCommonDBInterface mbResult = mobileOrderObj.selectByPrimaryKeys(whereMap);
		
		if (null != mbResult)
		{
			mobileOrderObj.deleteByPrimaryKeys(whereMap);
		}
		return ;
		
//		CAANMsg sc0031InMsg = new CAANMsg(SC0031ETMsg.class.getName());
//		JSCMobileOrderAccesser scMobileOrder = new JSCMobileOrderAccesser();
//		sc0031InMsg.set(SC0031ETMsg.MOBILE_ORDER_NO, orderNo);
//		try 
//		{
//			scMobileOrder.findByPrimaryKeyE(sc0031InMsg);
//			scMobileOrder.removeOrder(sc0031InMsg);
//		}
//		catch (CAANException ce)
//		{
//			return;
//		}
	}
}
