/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKKeiIdoKhCheck
*   ソースファイル名：JKKKeiIdoKhCheck.java
*   作成者          ：富士通
*   日付            ：2014年04月16日
*＜機能概要＞
*  契約異動可否判定です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v9.00.00    2014/04/16   FJ）江藤    新規作成(【ANK-2054-00-00】スマートリンク端末補償)
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.custom.constant.JKKKeiIdoKhCheckConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKCommonUtil;


/**
 * 契約異動可否判定部品です。<p>
 * <br>
 * @author FJ
 */
public class JKKKeiIdoKhCheck extends AbstractCommonComponent
{
	/** エラーメッセージ */
	public static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;
	
	/** 機器オプションサービス契約の異動対象外の機器提供サービスコード */
	private static final List<String> KKOP_IDO_TGG_KKOP_SVC_CD = new ArrayList<String>();
	
	static
	{
		// 機器オプションサービス契約の異動対象外の機器提供サービスコード
		KKOP_IDO_TGG_KKOP_SVC_CD.add(JKKStrConst.KKOP_SVC_CD_ROUTER);
		KKOP_IDO_TGG_KKOP_SVC_CD.add(JKKStrConst.KKOP_SVC_CD_TEL_ADAPT);
	}
	
	/**
	 * 契約異動可否判定の初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		if (param.getData(fixedText) == null)
		{  //本来は呼び出し側でparamに詰め込むべき
			param.setData(fixedText, new HashMap<String, Object>());
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}

	/**
	 * 機器オプションサービス契約異動可否判定処理を行います。<br>
	 * 親の機器提供サービス契約の状態遷移に伴い、機器オプションサービス契約が<br>
	 * 単純に共連れで状態遷移可能な場合、異動可と判定します。<br>
	 * 状態遷移に個別条件がある場合（多機能ルーターなど）、異動不可と判定します<br>
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @return true 異動可、false 異動不可
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public boolean checkKkopIdoKh(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData, String fixedText)
	throws Throwable
	{
		
		init(param, fixedText);

		// 入力パラメータチェック処理
		String errMsg = chkInput(handle, param, trgtData);
		
		if (!JKKCommonUtil.isNull(errMsg))
		{
			// チェックエラー
			throw new CCException("", new SCCallException("契約異動可否判定処理のパラメータエラー", String.valueOf(9051), 8011));
		}
		
		// INPUT情報の取得
		// 機器オプションサービスコード
		String inKkopSvcCd = (String)trgtData.get(JKKKeiIdoKhCheckConstCC.KKOP_SVC_CD);
		
//		// 異動区分
//		String inIdoDiv = (String)trgtData.get(JKKKeiIdoKhCheckConstCC.IDO_DIV);
		
		// ■異動対象外の機器オプションサービス判定
		if (isKkopIdoTggKkopSvc(inKkopSvcCd))
		{
			return false;
		}
		
		// ■異動区分毎にチェック
		// 初期開発時点では処理なし
		
		return true;
	}

	/**
	 * 入力パラメータのチェックを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	@SuppressWarnings("unchecked")
	private String chkInput(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData)
	{
		// チェックOK
		return "";
	}
	
	/**
	 * 機器オプションサービス契約の異動対象外の機器オプションサービス判定
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	private boolean isKkopIdoTggKkopSvc(String kkopSvcCd)
	{
		
		if (KKOP_IDO_TGG_KKOP_SVC_CD.contains(kkopSvcCd))
		{
			return true;
		}
		
		return false;
	}

	
	/*
	 * --------------------------------------------------------------------------------------------
	 *  以下共通で使用するUtil系のメソッド ↓↓↓↓↓
	 * --------------------------------------------------------------------------------------------
	 */

}
