/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUCheckKikiTeikyoStatus
*   ソースファイル名：JFUCheckKikiTeikyoStatus.java
*   作成者          ：富士通
*   日付            ：2012年08月08日
*＜機能概要＞
*   機器提供サービス契約状態チェック処理部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/08/08   FJ）美濃原  新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SWebLog;

import eo.common.constant.JFUStrConst;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * 機器提供サービス契約状態チェック処理部品です。
 * <br>
 * @author 富士通
 */
public class JFUCheckKikiTeikyoStatus
{

	/** 同日を含む／含まないの指定フラグ("1"：含む) */
	private static final String DOJITSU_HUKUMU = "1";

	// 処理結果
	/** 処理結果 */
	private static final String RTN_RESULT = "RTN_RESULT";
	/** 処理結果 OK */
	private static final String RTN_RESULT_OK = "OK";
	/** 処理結果 NG */
	private static final String RTN_RESULT_NG = "NG";
	/** サービス契約内訳番号 */
	private static final String RTN_SVC_KEI_UCWK_NO = "RTN_SVC_KEI_UCWK_NO";
	/** サービス契約 料金コースコード*/
	private static final String RTN_SVC_KEI_PCRSCD = "RTN_SVC_KEI_PCRSCD";
	/** サービス契約内訳 料金コースコード*/
	private static final String RTN_SVC_KEI_UCWK_PCRSCD = "RTN_SVC_KEI_UCWK_PCRSCD";

	/**
	 * 機器提供サービス契約状態チェック処理(C-CAS)。
	 * C-CASカード番号から該当するSTBの状態を取得し、STB状態チェック処理を呼び出して判定を行う。
	 * <br>
	 * @param bl 実行中のVIEWロジックインスタンス
	 * @param kikiSeizoNo 機器製造番号(C-CAS)
	 * @param opeDate 運用日付(null時はチェックしない)
	 * @return 処理結果
	 */
	public static Map<String, String> checkTvCcasKikiStatus(X31BWebBusinessLogic bl, String kikiSeizoNo, String opeDate)
	{
		X31SWebLog.DEBUG_LOG.debug("■■■■■☆☆☆機器提供サービス契約状態チェック(checkTvCcasKikiStatus)開始！☆☆☆■■■■■");

		String svcKeiPcrsCd = null;
		String svcKeiUcwkNo = null;
		String svcKeiUcwkPcrsCd = null;

		// (1) 入力パラメータのチェックを行う。
		if (bl == null || kikiSeizoNo == null || "".equals(kikiSeizoNo))
		{
			return setResult(RTN_RESULT_NG, svcKeiUcwkNo, svcKeiPcrsCd, svcKeiUcwkPcrsCd);
		}

		// 共有フォームBean
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		Map<String, String> conditionCcas = new HashMap<String, String>();
		Map<String, String> conditionStb = new HashMap<String, String>();
		Map<String, String> conditionUcwk = new HashMap<String, String>();

		// (2)共有フォームBeanの機器提供サービス契約情報からC-CAS情報を取得する。
		// 機器製造番号
		conditionCcas.put(CommonInfoCFConst.KIKI_SEIZO_NO_27, kikiSeizoNo);
		// 機器サービスコード(CCAS)
		conditionCcas.put(CommonInfoCFConst.KKTK_SVC_CD_27, JFUStrConst.KK0771_KKTK_SVC_CD_C011);
		// 機器提供サービス契約ステータス
		conditionCcas.put(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, JFUStrConst.CD00056_100);

		// 共有フォームBeanの機器提供サービス契約情報からC-CAS情報を取得
		X31SDataBeanAccess kikiSvcKeiInfoCcasBean =
				JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionCcas);

		if (kikiSvcKeiInfoCcasBean == null)
		{
			// 機器提供サービス契約ステータス
			conditionCcas.put(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, JFUStrConst.CD00056_030);
			kikiSvcKeiInfoCcasBean = JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionCcas);
		}

		// C-CAS情報が存在しない場合
		if (kikiSvcKeiInfoCcasBean == null)
		{
			return setResult(RTN_RESULT_NG, svcKeiUcwkNo, svcKeiPcrsCd, svcKeiUcwkPcrsCd);
		}

		// (3)機器提供サービス契約情報(C-CAS)を元に、サービス契約内訳の情報を取得する。
		// サービス契約内訳番号
		svcKeiUcwkNo = kikiSvcKeiInfoCcasBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, X31CWebConst.DATABEAN_GET_VALUE);
		conditionUcwk.put(CommonInfoCFConst.SVC_KEI_UCWK_NO_24, svcKeiUcwkNo);

		// 共有フォームBeanの機器提供サービス契約情報からサービス契約内訳情報を取得
		X31SDataBeanAccess[] svcKeiUcwkInfo =
				JFUWebCommon.getDataBeanListByPathWithKey(commonInfoBean, JFUWebCommon.SVC_KEI_UCWK_INFO, conditionUcwk);

		if (svcKeiUcwkInfo == null || svcKeiUcwkInfo.length == 0)
		{
			return setResult(RTN_RESULT_NG, svcKeiUcwkNo, svcKeiPcrsCd, svcKeiUcwkPcrsCd);
		}
		else
		{
			for (int idx = 0; idx < svcKeiUcwkInfo.length; idx++)
			{
				// サービス契約内訳ステータスが"030"締結済、"100"サービス提供中以外はエラー
				svcKeiUcwkPcrsCd = JFUWebCommon.getDataBeanItemByPath(svcKeiUcwkInfo[idx], CommonInfoCFConst.PCRS_CD_24);
				String status = JFUWebCommon.getDataBeanItemByPath(svcKeiUcwkInfo[idx], CommonInfoCFConst.SVC_KEI_UCWK_STAT_24);
				if (!(JFUStrConst.CD00056_100.equals(status) || JFUStrConst.CD00056_030.equals(status)))
				{
					return setResult(RTN_RESULT_NG, svcKeiUcwkNo, svcKeiPcrsCd, svcKeiUcwkPcrsCd);
				}
				break; //１件しかとれないはず。
			}
		}

		// (4)機器提供サービス契約情報(C-CAS)を元に、STBの情報を取得する。
		// 機器サービスコード(STB)
		conditionStb.put(CommonInfoCFConst.KKTK_SVC_CD_27, JFUStrConst.KK0771_KKTK_SVC_CD_C009);
		// 機器提供サービス契約ステータス
		conditionStb.put(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, JFUStrConst.CD00056_100);
		// サービス契約内訳番号
		conditionStb.put(CommonInfoCFConst.SVC_KEI_UCWK_NO_27, kikiSvcKeiInfoCcasBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_27,
				X31CWebConst.DATABEAN_GET_VALUE));

		// 共有フォームBeanの機器提供サービス契約情報からSTB情報を取得
		X31SDataBeanAccess kikiSvcKeiInfoBeanStb =
				JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionStb);

		if (kikiSvcKeiInfoBeanStb == null)
		{
			// 機器提供サービス契約ステータス
			conditionStb.put(CommonInfoCFConst.KKTK_SVC_KEI_STAT_27, JFUStrConst.CD00056_030);
			kikiSvcKeiInfoBeanStb = JFUWebCommon.getDataBeanTypeByPathWithKey(commonInfoBean, JFUWebCommon.KKTK_SVC_KEI_INFO, conditionStb);
		}

		// (5)料金コースコードを取得する。
		// (6)STB状態チェック処理を行い、処理結果を返却する。
		boolean isRtnOk = false;

		svcKeiPcrsCd = getPcrsCd(commonInfoBean); // サービス契約.料金コースコード
		isRtnOk = checkStb(kikiSvcKeiInfoBeanStb, svcKeiPcrsCd);

		// (7)予約適用日チェック
		if (isRtnOk && opeDate != null)
		{
			// 予約適用日＜＝オンライン日付
			if (JPCUtilCommon.isPastDate(kikiSvcKeiInfoBeanStb.sendMessageString(CommonInfoCFConst.RSV_APLY_YMD_27, X31CWebConst.DATABEAN_GET_VALUE),
					opeDate, DOJITSU_HUKUMU))
			{
				isRtnOk = true;
			}
			else
			{
				isRtnOk = false;
			}
		}

		X31SWebLog.DEBUG_LOG.debug("■■■■■☆☆☆機器提供サービス契約状態チェック(checkTvCcasKikiStatus)終了！☆☆☆■■■■■");

		if (isRtnOk)
		{
			return setResult(RTN_RESULT_OK, svcKeiUcwkNo, svcKeiPcrsCd, svcKeiUcwkPcrsCd);
		}
		return setResult(RTN_RESULT_NG, svcKeiUcwkNo, svcKeiPcrsCd, svcKeiUcwkPcrsCd);

	}

	/**
	 * STB状態チェック処理。
	 * 機器提供サービス契約情報を元に、オプションチャンネルの申込・解約の可否状態の判定を行う。
	 * <br>
	 * @param kikiSvcKeiInfoBeanStb 機器提供サービス契約情報
	 * @param pcrsCd サービス契約情報の料金コースコード
	 * @return true:正常、false:エラー
	 */
	public static boolean checkStb(X31SDataBeanAccess kikiSvcKeiInfoBeanStb, String pcrsCd)
	{
		X31SWebLog.DEBUG_LOG.debug("■■■■■☆☆☆STB状態チェック(checkStb)開始！☆☆☆■■■■■");

		// (1) 入力パラメータのチェックを行う。
		if (kikiSvcKeiInfoBeanStb == null || pcrsCd == null)
		{
			return false;
		}

		boolean isRtnOk = false;

		// (2)料金コースコードが、"A37"(地デジ・ＢＳコース)以外の場合
		if (!JFUStrConst.CD00134_A37.equals(pcrsCd))
		{
			/*
			// 機器提供サービスコード
			String kktkSvcCD = JFUWebCommon.getDataBeanItemByPath(kikiSvcKeiInfoBeanStb, CommonInfoCFConst.KKTK_SVC_CD_27);
			// サービス契約内訳番号
			String svcKeiUcwkNo = JFUWebCommon.getDataBeanItemByPath(kikiSvcKeiInfoBeanStb, CommonInfoCFConst.SVC_KEI_UCWK_NO_27);
			*/

			// ｅｏＴＶ機器設置承認状態コード
			String statCd = JFUWebCommon.getDataBeanItemByPath(kikiSvcKeiInfoBeanStb, CommonInfoCFConst.EO_TV_KKST_SNN_STAT_CD_27);

			// eoTV機器設置承認状態コード(EO_TV_KKST_SNN_STAT_CD)="1"(承認済み) 又は "2"(視聴制御連携済み) は正常
			if ((JFUStrConst.CD00644_1.equals(statCd)) || (JFUStrConst.CD00644_2.equals(statCd)))
			{
				isRtnOk = true;
			}
		}

		X31SWebLog.DEBUG_LOG.debug("■■■■■☆☆☆STB状態チェック(checkStb)終了！☆☆☆■■■■■");

		return isRtnOk;

	}

	/**
	 * 料金コースコード取得。
	 *
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 * @return サービス契約情報 料金コースコード
	 */
	private static String getPcrsCd(X31SDataBeanAccess commonInfoBean)
	{

		// ＷＥＢ変更情報/0/現顧客契約情報/0/サービス契約情報/0/料金コースコード
		String pcrsCd =
				JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0 + CommonInfoCFConst.PCRS_CD_23);

		return pcrsCd;

	}

	/**
	 * 処理結果の編集
	 *
	 * <br>
	 * @param resultOk	処理結果
	 * @param svcKeiUcwkNo	サービス契約内訳番号
	 * @param svcKeiPcrscd	サービス契約 料金コースコード
	 * @param svcKeiUcwkPcrscd	サービス契約内訳 料金コースコード
	 * @return 処理結果情報
	 */
	private static Map<String, String> setResult(String resultOk, String svcKeiUcwkNo, String svcKeiPcrscd, String svcKeiUcwkPcrscd)
	{

		Map<String, String> resultMap = new HashMap<String, String>();

		/* 処理結果 */
		resultMap.put(RTN_RESULT, resultOk);
		/* サービス契約内訳番号 */
		resultMap.put(RTN_SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		/* サービス契約 料金コースコード*/
		resultMap.put(RTN_SVC_KEI_PCRSCD, svcKeiPcrscd);
		/* サービス契約内訳 料金コースコード*/
		resultMap.put(RTN_SVC_KEI_UCWK_PCRSCD, svcKeiUcwkPcrscd);

		return resultMap;

	}
}
