/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKUejbCheckUtil
*   ソースファイル名：JKUejbCheckUtil.java
*   作成者          ：富士通
*   日付            ：2011年04月01日
*＜機能概要＞
*   工事受付の共通チェック処理部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/08/01   FJ          新規作成
*   v12.00.00   2015/03/04   FJ)阪口     【OM-2015-0000381】電話追加時に工事案件情報が書き換わらない
*
**********************************************************************/

package eo.ejb.common;

import java.util.HashMap;

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.JKUStrConst;
import eo.common.util.JKUCheckSTBCount;
import eo.ejb.cbm.entity.KU0021ETMsg;
import eo.ejb.cbm.entity.KU0021LE;
import eo.ejb.cbm.entity.KU0041ETMsg;
import eo.ejb.cbm.entity.KU0141ETMsg;
import eo.ejb.cbm.entity.KU0141LE;
import eo.ejb.cbs.cbsmsg.EKU0041D010CBSMsg;

/**
 * 工事受付の共通チェック処理を定義するクラス。<p>
 * 工事受付共通アクセッサー部品で実装します。
 * <BR>
 * @author 富士通
 */
public class JKUejbCheckUtil
{
	/** KCNSTB種別コードカウント候補 */
	private static final String[] KCN_STB_KIND_CD_KOHO = new String[]
	{
		"2",
		"A",
		"B",
		"C"
	};
	
	/**
	 * PLCモデム台数取得
	 * @param kojiakNo
	 * @return HashMap key:         value
	 *                  KIKI_BUY     買取台数
	 *                  KIKI_RENT    レンタル台数
	 */
	public static HashMap<String, String> getPlcModemRentCount(String kojiakNo)
	{
		HashMap<String, String> retMap = new HashMap<String, String>();
		
		// 工事案件番号、機器種別をキーに工事案件対象宅内機器を取得する
		CAANMsg inETMsg = new CAANMsg(KU0141ETMsg.class.getName());
		inETMsg.set(KU0141ETMsg.KOJIAK_NO, kojiakNo);
		inETMsg.set(KU0141ETMsg.TAKNKIKI_SBT_CD, JKUStrConst.TKNKKSBT_PLC);
		KU0141LE le0141 = new KU0141LE();
		CAANMsg[] outETMsg = null;
		try
		{
			outETMsg = le0141.findByCondition(inETMsg);
		}
		catch (CAANException ce)
		{
			retMap.put(JKUStrConst.KIKI_BUY, "0");
			retMap.put(JKUStrConst.KIKI_RENT, "0");
			return retMap;
		}
		
		int rentCnt = 0;
		int buyCnt = 0;
		for (int i = 0; i < outETMsg.length; i++)
		{
			// 工事案件対象宅内機器ステータスがなしの場合はカウントアップしない
			if (JKUStrConst.CD00475_NASHI.equals(outETMsg[i].getString(KU0141ETMsg.KOJIAK_TRGT_TAKNKIKI_STAT)))
			{
				continue;
			}
			
			if ((outETMsg[i].getString(KU0141ETMsg.CHGE_ROUTER_RENT_CD) == null))
			{
				if (JKUStrConst.KIKI_RENT.equals(outETMsg[i].getString(KU0141ETMsg.RSV_ROUTER_RENT_CD)))
				{
					rentCnt += 1;
				}
				else
				{
					buyCnt += 1;
				}
				
			}
			else
			{
				if (JKUStrConst.KIKI_RENT.equals(outETMsg[i].getString(KU0141ETMsg.CHGE_ROUTER_RENT_CD)))
				{
					rentCnt += 1;
					
				}
				else
				{
					buyCnt += 1;
				}
			}
		}
		retMap.put(JKUStrConst.KIKI_BUY, String.valueOf(buyCnt));
		retMap.put(JKUStrConst.KIKI_RENT, String.valueOf(rentCnt));
		return retMap;
	}

	/**
	 * 電話台数カウントを行います。
	 * @param cbsMsg ＣＢＳメッセージ
	 * @param kojiakNo 工事案件番号
	 * @return String 電話台数
	 */
	public static String getTelCnt(CAANMsg cbsMsg, String kojiakNo)
	{
		int telCnt = 0;
		
		// eo光電話番号1
		for (int i = 1; i < 6; i++)
		{
			if(cbsMsg.getString("eoh_tel_no_" + String.valueOf(i)) != null)
			{
				telCnt += 1;
			}
		}
		
		// 工事案件番号をキーに工事案＜光ネット＞を取得する
		CAANMsg inETMsg = new CAANMsg(KU0021ETMsg.class.getName());
		inETMsg.set(KU0021ETMsg.KOJIAK_NO, kojiakNo);
		KU0021LE le0021 = new KU0021LE();
		CAANMsg outETMsg = null;
		outETMsg = le0021.findByPrimaryKey(inETMsg);
		if (outETMsg != null)
		{
			for (int i = 1; i < 6; i++)
			{
				if (outETMsg.getString("EOH_TELNO_" + String.valueOf(i)) != null)
				{
					telCnt += 1;
				}
			}
		}

		return String.valueOf(telCnt);
	}
	
// OM-2015-0000381 ADD START
	/**
	 * 電話台数カウントを行います。（サービスIFのIN項目）
	 * @param cbsMsg ＣＢＳメッセージ
	 * @param kojiakNo 工事案件番号
	 * @return String 電話台数
	 */
	public static String getTelCntInMsg(CAANMsg cbsMsg, String kojiakNo)
	{
		int telCnt = 0;
		
		// eo光電話番号1
		for (int i = 1; i < 6; i++)
		{
			if(cbsMsg.getString("eoh_tel_no_" + String.valueOf(i)) != null)
			{
				telCnt += 1;
			}
		}
		
		return String.valueOf(telCnt);
	}
// OM-2015-0000381 ADD END
	
	/**
	 * STB台数をカウントします(KCN用)
	 * @param kcnStbMskmCnt KCNSTB申込台数
	 * @param kcnStbKindCd KCNSTB種類コード
	 * @param kojiakSbtCd 工事案件種別コード
	 * @return retMap
	 */
	public static HashMap<String, String> getKCNSTBCount(String kcnStbMskmCnt, String kcnStbKindCd, String kojiakSbtCd)
	{
		// 戻り値マップ
		HashMap<String, String> retMap = new HashMap<String, String>();
		
		// 工事案件種別が新設、住変(新設)、リンクSTB、面開発の場合
		if(JKUStrConst.CD00577_NEWESTA.equals(kojiakSbtCd) || 
				JKUStrConst.CD00577_AD_CHG_NEWESTA.equals(kojiakSbtCd) || 
				JKUStrConst.CD00577_LINK_STB.equals(kojiakSbtCd) || 
				JKUStrConst.CD00577_MNKHT.equals(kojiakSbtCd))
		{
			// KCNSTB申込台数がNULLの場合は0を設定する
			if(null == kcnStbMskmCnt)
			{
				retMap.put(KU0041ETMsg.STB_MSKM_CNT, "0");
			}
			else
			{
				retMap.put(KU0041ETMsg.STB_MSKM_CNT, kcnStbMskmCnt);
			}
			
			// KCNSTB種類コードがNULLの場合は0を設定する
			if(null == kcnStbKindCd)
			{
				retMap.put(KU0041ETMsg.HDR_STB_MSKM_CNT, "0");
			}
			else
			{
				// HDR_STB申込台数カウント用変数
				int hdrStbCounter = 0;
				
				// KCNSTB種類コードを一文字目から検索し、"2"である数をカウントする
				for(int i = 0; i < kcnStbKindCd.length(); i++)
				{
					String chr = kcnStbKindCd.substring(i, i + 1);
					
					for(int j = 0; j < KCN_STB_KIND_CD_KOHO.length; j++)
					{
						if(KCN_STB_KIND_CD_KOHO[j].equals(chr))
						{
							hdrStbCounter++;
							break;
						}
					}
				}
				
				retMap.put(KU0041ETMsg.HDR_STB_MSKM_CNT, Integer.toString(hdrStbCounter));
			}
		}
		else
		{
			// 工事案件種別が新設、住変(新設)、リンクSTB、面開発でない場合
			retMap.put(KU0041ETMsg.STB_MSKM_CNT, "0");
			retMap.put(KU0041ETMsg.HDR_STB_MSKM_CNT, "0");
		}
		
		// STB契約台数は必ず0
		retMap.put(KU0041ETMsg.STB_KEI_CNT, "0");
		
		return retMap;
	}
	
	/**
	 * STB台数をカウントします。
	 * @param kojiakNo 工事案件番号
	 * @param kojiakSbtCd 工事案件種別
	 * @return STB台数を格納したオブジェクト(JKUejbCheckSTBCount)
	 * @throws CAANException 
	 */
	public JKUCheckSTBCount checkSTBCount(String kojiakNo, String kojiakSbtCd) throws CAANException
	{
		// 工事案件番号をキーに工事案件対象宅内機器を取得する
		CAANMsg inETMsg = new CAANMsg(KU0141ETMsg.class.getName());
		inETMsg.set(KU0141ETMsg.KOJIAK_NO, kojiakNo);
		inETMsg.set(KU0141ETMsg.TAKNKIKI_SBT_CD, JKUStrConst.TKNKKSBT_STB);
		KU0141LE le0141 = new KU0141LE();
		CAANMsg[] outKU0141ETMsg = null;
		try
		{
			outKU0141ETMsg = le0141.findByCondition(inETMsg);
		}
		catch (CAANException ce)
		{
			throw ce;
		}
		
		HashMap[] map = new HashMap[outKU0141ETMsg.length];
		
		for(int i = 0; i < outKU0141ETMsg.length; i++)
		{
			map[i] = outKU0141ETMsg[i].getHashMap();
		}
		
//		return new JKUejbCheckSTBCount(kojiakSbtCd, map);
		return new JKUCheckSTBCount(kojiakSbtCd, map);

	}
	
	/**
	 * KCNSTB申込台数とKCNSTB種別コードの整合性チェック
	 * @param cbsMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return boolean
	 */
	public static boolean checkKcnStb(CAANMsg cbsMsg, AgentDispatchContext inContext)
	{
		// 工事受付詳細コード
		String kojiUkDtailCd = cbsMsg.getString(EKU0041D010CBSMsg.KOJI_UK_DTAIL_CD);
		// KCNSTB申込台数
		String kcnStbMskmCnt = cbsMsg.getString(EKU0041D010CBSMsg.KCN_STB_MSKM_CNT);
		// KCNSTB種別コード
		String kcnStbKindCd = cbsMsg.getString(EKU0041D010CBSMsg.KCN_STB_KIND_CD);
		
		// 工事受付詳細コードが新規または引越しまたはTV機器変えるの場合
		if(JKUStrConst.CD00885_NEW.equals(kojiUkDtailCd) ||
				JKUStrConst.CD00885_HIKKOSHI.equals(kojiUkDtailCd) ||
				JKUStrConst.CD00885_TV_KIKI_CHG.equals(kojiUkDtailCd))
		{
			int intKcnStbMskmCnt = 0;
			// KCNSTB申込台数がNULLの場合は他の単関連エラーなのでTrueを返す
			if(null == kcnStbMskmCnt)
			{
				return true;
			}
			
			intKcnStbMskmCnt = Integer.parseInt(kcnStbMskmCnt);
			
			// KCNSTB申込台数が0且つKCNSTB種別コードがNULLのはTrueを返す
			if(intKcnStbMskmCnt == 0 && null == kcnStbKindCd)
			{
				return true;
			}
			
			// KCNSTB申込台数が0でない且つKCNSTB種別コードがNULLの場合エラー
			if(intKcnStbMskmCnt != 0 && null == kcnStbKindCd)
			{
				return false;
			}
			
			// KCNSTB申込台数とKCNSTB種別コードの長さが等しくない場合エラー
			if(Integer.parseInt(kcnStbMskmCnt) != kcnStbKindCd.length())
			{
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 工事案件ステータス返却部品
	 * 工事案件かマンション工事案件かを判断し、工事案件ステータスとマンション工事案件状態コードのうち有効な方の値を返却する
	 * @param kojiakStat 工事案件ステータス
	 * @param mansKojiakStatCd マンション工事案件状態コード
	 * @return String 工事案件ステータスorマンション工事案件状態コード
	 */
	public static String getYkKojiakStat(String kojiakStat, String mansKojiakStatCd)
	{
		// マンション工事案件状態コードが未設定の場合は、工事案件ステータスを返却
		if(mansKojiakStatCd == null || "".equals(mansKojiakStatCd))
		{
			return kojiakStat;
		}
		else
		{
			// マンション工事案件状態コードが設定済の場合は、マンション工事案件である
			return mansKojiakStatCd;
		}
	}
}
