/*********************************************************************
 *   All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbEKK0361D010Edit
 *	ソースファイル名：JKKejbEKK0361D010Edit.java
 *	作成者			：富士通
 *	日付			：2012年06月20日
 *＜機能概要＞
 *	オプションサービス契約編集部品クラス
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/06/20	富士通		新規作成
 *	v7.00.00	2014/01/05	FJ)大山		IT2-2013-0000904
 *
 **********************************************************************/

package eo.ejb.common.edit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0361D010CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.entity.JKKejbKK0341KRCK;

/**
 * <p>
 * オプションサービス契約の表示用サービス提供開始年月日の編集を行う部品クラスです
 * </p>
 * @author 富士通
 */
public class JKKejbEKK0361D010Edit
{

	/** オプションサービスコード（IPv6）*/
	private static final String OPT_SVC_CD_IPV6 = "B070";

	/**
	 * コンストラクタです
	 */
	public JKKejbEKK0361D010Edit()
	{
	}

	/**
	 * <p>
	 * オプションサービス契約の表示用サービス提供開始年月日を返却します
	 * </p>
	 * @param  inMsg     処理対象のメッセージキャリア
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @return String    表示用サービス提供開始年月日
	 */
	public String getDspSvctkStaYmd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0361D010Edit#setDspSvctkStaYmd");

		// オプションサービスコードが"B070"(IPv6)の場合
		if (OPT_SVC_CD_IPV6.equals(inMsg.getString(EKK0361D010CBSMsg.OP_SVC_CD)))
		{
			JKKejbKK0341KRCK kk0341Krck = new JKKejbKK0341KRCK();
			
			// IPv6アドレスが入力されているかつルータが出荷済みか？
			if (!inMsg.isNull(EKK0361D010CBSMsg.IPV6_AD_IFID) && kk0341Krck.isIPv6RouteKikiSyukaChk(inMsg, inContext , inMsg.getString(EKK0361D010CBSMsg.SVC_KEI_NO)))
			{
				// サービス利用希望年月日を返却する
				return inMsg.getString(EKK0361D010CBSMsg.SVC_USE_STA_KIBO_YMD);
			}
		} else {
			// サービス利用希望年月日を返却する
			return inMsg.getString(EKK0361D010CBSMsg.SVC_USE_STA_KIBO_YMD);
		}

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0361D010Edit#setDspSvctkStaYmd");

		return null;
	}
	
	/**
	 * <p>
	 * ルータが出荷済みか否かを判定する
	 * </p>
	 * @param  inMsg     処理対象のメッセージキャリア
	 * @param  inContext ディスパッチコンテキスト
	 * @return true：ルーターが出荷済　false：ルーターが出荷済でない
	 */
	
	private boolean isRuterSyukkaZumi(CAANMsg inMsg, AgentDispatchContext inContext) {
		
		// 入力値.サービス契約番号が入力されていない場合
		if (inMsg.isNull(EKK0361D010CBSMsg.SVC_KEI_NO))
		{
			return false;
		}

		// 機器提供サービス契約の宅内機器型式コードを取得します
		CAANMsg msg = this.getTaknkikiModelCd(inMsg, inContext, inMsg.getString(EKK0361D010CBSMsg.SVC_KEI_NO));
		
		// 検索結果が0件の場合
		if (msg == null)
		{
			return false;
		}
		
		// 宅内機器型式コードをキーに宅内機器型式のIPv6対応フラグが"有"の件数を取得します
		long retlong = this.getIPv6AriCnt(inMsg, inContext, msg.getString(KK0341ETMsg.TAKNKIKI_MODEL_CD));
		
		// 検索結果が0件の場合
		if (retlong == 0)
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * サービス契約番号をキーに機器提供サービス契約の宅内機器型式コードを取得します
     * </p>
	 * @param  inMsg      処理対象のメッセージキャリア
	 * @param  inContext  ディスパッチコンテキスト
	 * @param  svcKeiNo   サービス契約番号
	 * @return 指定したサービス契約番号に紐付く、機器提供サービス契約の宅内機器型式コード
	 */
	private CAANMsg getTaknkikiModelCd(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// 返却メッセージ
		CAANMsg retMsg = null;
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// SQL文
		StringBuffer sbSql = new StringBuffer();

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			sbSql.append("SELECT ");
			sbSql.append("    KK0341.TAKNKIKI_MODEL_CD ");
			sbSql.append("FROM ");
			sbSql.append("    KK_T_KKTK_SVC_KEI KK0341 ");
			sbSql.append("WHERE ");
			sbSql.append("    KK0341.SVC_KEI_NO = ? ");
			sbSql.append("    AND KK0341.KIKI_SEIZO_NO IS NOT NULL ");
			sbSql.append("    AND (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sbSql.append("        (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sbSql.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sbSql.append("         WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sbSql.append("         AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sbSql.append("         AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sbSql.append("         AND    KK0341_GENE.MK_FLG = '0' ");
			sbSql.append("      GROUP BY  KK0341_GENE.KKTK_SVC_KEI_NO) ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(サービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 取得結果をメッセージキャリアに格納
			if (rsltQuery.next())
			{
				// カレントレコード取得のため、取得するレコードは1件のみ
				retMsg = new CAANMsg(KK0341ETMsg.class.getName());
				retMsg.set(KK0341ETMsg.TAKNKIKI_MODEL_CD, rsltQuery.getString(1));	// 宅内機器型式コード 
			}

			return retMsg;
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}
	
	/**
	 * <p>
	 * 宅内機器型式コードをキーに宅内機器型式のIPv6対応フラグが"有"の件数を取得します
     * </p>
	 * @param  inMsg           処理対象のメッセージキャリア
	 * @param  inContext       ディスパッチコンテキスト
	 * @param  taknkikiModelCd 宅内機器型式コード
	 * @return 指定した宅内機器型式コードに紐付く、宅内機器型式のIPv6対応フラグが"有"の件数
	 */
	private long getIPv6AriCnt(CAANMsg inMsg, AgentDispatchContext inContext, String taknkikiModelCd)
	{
		
		// 宅内機器型式コードがnullの場合
		if (taknkikiModelCd == null)
		{
			return 0;
		}
		
		// 返却メッセージ
		long retCnt = 0L;
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// SQL文
		StringBuffer sbSql = new StringBuffer();

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			sbSql.append(" SELECT COUNT(*) AS CNT ");
			sbSql.append(" FROM ");
			sbSql.append("    ZM_M_TAKNKIKI_MODEL ZM0411 ");
			sbSql.append(" WHERE ");
			sbSql.append("    ZM0411.TAKNKIKI_MODEL_CD = ? ");
			sbSql.append("    AND ZM0411.IPV6_TAIO_FLG = '1' ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(宅内機器型式コード)
			CAANJDBCUtil.setParam(pstmt, 1, taknkikiModelCd);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 取得結果をメッセージキャリアに格納
			if (rsltQuery.next())
			{
				retCnt = rsltQuery.getLong("CNT");
			}

			return retCnt;
		}
		catch (SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}
}
