/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK1071C151Edit
*	ソースファイル名：JKKejbEKK1071C151Edit.java
*	作成者			：富士通
*	日付			：2012年06月21日
*＜機能概要＞
*	住所不備電話番号情報審査部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/06/21	富士通		新規作成
*	v5.00.00	2013/06/27	FJ) 沖田	IT1-2013-0001288
*
**********************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C151CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C151CBSMsg1List;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 住所不備電話番号情報審査部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C151Edit
{

	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";

	/** 審査チェック結果 WORNING */
	private static final String CHECK_WG = "02";

	/** 異動区分 新規契約 */
	private static final String IDO_IDV_NEW = "00001";

	/** 異動区分 サービス追加 */
	private static final String IDO_IDV_ADD = "00002";
	
	/** 住所コード存在判定エラー */
	private static final String NG_ADCD = "01";
	
	/** 郵便番号存在判定エラー */
	private static final String NG_PCD = "02";
	
	/** 住所名称一致判定エラー */
	private static final String NG_MEISHO = "03";
	
	/** 都道府県名判定エラー */
	private static final String NG_STATE = "030";
	
	/** 市区町村名一致判定エラー */
	private static final String NG_CITY = "031";
	
	/** 番地号一致判定エラー */
	private static final String NG_BNCHIGO = "032";
	
	/** 住所マスタ最下層チェックワーニング */
	private static final String WG_AD_KASO = "06";
	
	/** 回線場所住所未確定フラグ（未確定） */
	private static final String MI_FIX_FLG_MI = "1";

	/** 審査詳細種別コード(緊急通報用住所不備チェック) */
	private static final String JGE_DTL_SBT_CD_EMG_AD_HBI = "044";

	/** 審査対象画面タブコード 電話１ */
	private static final String JDG_SCREEN_TAB_TEL1 = "08";

	/** 審査対象画面タブコード 電話２ */
	private static final String JDG_SCREEN_TAB_TEL2 = "09";

	/** 審査対象画面項目コード : ご利用場所 */
	private static final String UDGE_TG_SCREEN_KMK_CD_AD_HBI = "002";
	
	/** 審査詳細メッセージID(緊急通報用住所不備チェック) */
	private static final String JDG_DTL_MSG_ID = "EKB0720-KW";
	
	/** 審査詳細メッセージID */
	private static final String JDG_DTL_MSG_ID_AD = "EKB5400-KW";

	/** 審査詳細メッセージID(機器送付先住所不備チェック) */
	private static final String JDG_DTL_MSG_ID_EKBD290__Q = "EKBD290--Q";
	
	/** メッセージ埋込み文字(緊急通報用住所不備チェック) */
	private static final String MSG_UMKM_MOJI_ADCD_HBI = "住所マスタ,緊急通報用住所";
	
	/** メッセージ埋込み文字(緊急通報用住所不備チェック) */
	private static final String MSG_UMKM_MOJI_PCD_HBI = "郵便番号";

	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_STATE_HBI = "都道府県";

	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_CITY_HBI = "市区町村";
	
	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_BNCHIGO_HBI = "番地号";
	
	/** メッセージ埋込み文字(緊急通報用住所不備チェック) */
	private static final String MSG_UMKM_MOJI_AD_KASOU_WORNING = "緊急通報用住所";
	
	/** 住所チェックレベル（1：全て） */
	private static final String AD_CHK_LV_ONE = "1";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C151Edit()
	{
	}

	/**
	 * <p>
	 * 住所不備電話番号情報審査チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getAdHbiOkForTelInfChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		CAANMsg[] emgAdList = inMsg.getCAANMsgList(EKK1071C151CBSMsg.EKK1071C151CBSMSG1LIST);
		// リストがnullまたは0件の場合はチェックしない
		if(emgAdList == null || emgAdList.length == 0)
		{
			return CHECK_OK;
		}

		// 異動区分が「新規契約」、「サービス追加」以外の場合は処理を行わない
		String idoDiv = inMsg.getString(EKK1071C151CBSMsg.IDO_DIV);

		if (!IDO_IDV_NEW.equals(idoDiv) && !IDO_IDV_ADD.equals(idoDiv))
		{
			return CHECK_OK;
		}

		// 審査詳細実施制御の結果からチェックの実施判定を行う（緊急通報用住所不備チェック）
		String errResultKK1831 = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C151CBSMsg.JDG_JSSI_KINO_SKBT_CD), JGE_DTL_SBT_CD_EMG_AD_HBI);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errResultKK1831 == null || "".equals(errResultKK1831))
		{
			return CHECK_OK;
		}

		// 埋め込み文字（接尾語）保持用項目の設定
		String umkmMoji = null;
		
		// メッセージID
		String msgId = JDG_DTL_MSG_ID;

		// 審査結果
		Object result = null;
		String errResult = CHECK_OK;

		// 審査.審査結果コード設定用
		String[] jdgResult = new String[1];

		int errIdx = 0;

		for(int i = 0; i < emgAdList.length; i++)
		{	
			errIdx = i;
			
			// 住所不備チェックを行う。
			result = adHbiCheck(inMsg, emgAdList, i);

			if(!CHECK_OK.equals(result))
			{
				errResult = errResultKK1831;
				break;
			}

			// 利用場所住所一致チェックを行う
			result = riyoBashoCheck(inMsg, emgAdList, i);

			if(!CHECK_OK.equals(result))
			{
				errResult = errResultKK1831;
				break;
			}

			// 緊急通報用住所チェックレベルが"1"(全て)の場合、住所コード最下層チェックを行う
			if (AD_CHK_LV_ONE.equals(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AD_CHK_LV)))
			{
				result = adCdMostBottomPri(inMsg, emgAdList, i);
			}

			if (WG_AD_KASO.equals(result))
			{
				errResult = CHECK_WG;
			}
			else if(!CHECK_OK.equals(result))
			{
				errResult = errResultKK1831;
				break;
			}
		}
		
//		// 回線場所住所コードの住所最下層チェックを行います
//		if (CHECK_OK.equals(errResult))
//		{
//			// 回線場所住所チェックレベルが"1"(全て)の場合
//			if (AD_CHK_LV_ONE.equals(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_AD_CHK_LV)))
//			{
//				// 住所最下層チェックを実施
//				result = adCdMostBottomPriKaisen(inMsg);
//				
//				if (WG_AD_KASO.equals(result))
//				{
//					errResult = CHECK_WG;
//				}
//				else if(!CHECK_OK.equals(result))
//				{
//					errResult = errResultKK1831;
//				}
//			}
//		}

		// 審査の結果がNGの場合（埋め込み文字が設定されている場合）、審査詳細に登録する
		if(!CHECK_OK.equals(errResult))
		{
			if(NG_ADCD.equals(result) || NG_MEISHO.equals(result))
			{
				umkmMoji = MSG_UMKM_MOJI_ADCD_HBI;
			}
			else if(NG_PCD.equals(result))
			{
				msgId = JDG_DTL_MSG_ID_AD;
				umkmMoji = MSG_UMKM_MOJI_PCD_HBI;
			}
			else if(NG_STATE.equals(result))
			{
				msgId = JDG_DTL_MSG_ID_AD;
				umkmMoji = MSG_UMKM_MOJI_STATE_HBI;
			}
			else if(NG_CITY.equals(result))
			{
				msgId = JDG_DTL_MSG_ID_AD;
				umkmMoji = MSG_UMKM_MOJI_CITY_HBI;
			}
			else if(NG_BNCHIGO.equals(result))
			{
				msgId = JDG_DTL_MSG_ID_AD;
				umkmMoji = MSG_UMKM_MOJI_BNCHIGO_HBI;
			}
			
			if (WG_AD_KASO.equals(result))
			{
				umkmMoji = MSG_UMKM_MOJI_AD_KASOU_WORNING;
				msgId = JDG_DTL_MSG_ID_EKBD290__Q;
				errResult = CHECK_WG;
			}
			createisAdHbiOkForTelInf(inMsg, inContext, errResult, JGE_DTL_SBT_CD_EMG_AD_HBI, umkmMoji, errIdx, msgId);
			jdgResult[0] = errResult;
		}
		
		return kk1071.getJudgeJudgeRsltCd(jdgResult);
	}
	
	/**
	 * <p>
	 * 住所不備チェックを行う。
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param emgAdList   リスト
	 * @param i           行番号
	 * @return 住所不備チェック結果
	 */
	private Object adHbiCheck(CAANMsg inMsg, CAANMsg[] emgAdList , int i)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 引数設定
		String adCd = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AD_CD);
		String pcd = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_HOSEI_PCD);
		String stateNm = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_STATE_NM);
		String cityNm = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_CITY_NM);
		String oaztsuNm = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_OAZTSU_NM);
		String azchoNm = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AZCHO_NM);
		String banchiGo = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_BNCHIGO);

		return kk1071.adHbiCheck(inMsg, adCd, pcd, stateNm, cityNm, oaztsuNm, azchoNm, banchiGo);
	}
	
	/**
	 * <p>
	 * 利用場所住所一致チェックを行う
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param emgAdList   リスト
	 * @param i           行番号
	 * @return 利用場所住所一致チェック結果
	 */
	private Object riyoBashoCheck(CAANMsg inMsg, CAANMsg[] emgAdList , int i)
	{
		Object result = CHECK_OK;

		// 引数設定
		String adCd = replaceEmp(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AD_CD));
		String pcd = replaceEmp(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_HOSEI_PCD));
		String stateNm = replaceEmp(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_STATE_NM));
		String cityNm = replaceEmp(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_CITY_NM));
		String oaztsuNm = replaceEmp(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_OAZTSU_NM));
		String azchoNm = replaceEmp(emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AZCHO_NM));

		// 回線住所情報
		String kaisenAdCd = replaceEmp(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_AD_CD));
		String kaisenPcd = replaceEmp(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_PCD));
		String kaisenStateNm = replaceEmp(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_STATE_NM));
		String kaisenCityNm = replaceEmp(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_CITY_NM));
		String kaisenOaztsuNm = replaceEmp(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_OAZTSU_NM));
		String kaisenAzchoNm = replaceEmp(inMsg.getString(EKK1071C151CBSMsg.KAISEN_PLACE_AZCHO_NM));

		if (!(adCd.equals(kaisenAdCd)
				&& pcd.equals(kaisenPcd)
				&& stateNm.equals(kaisenStateNm)
				&& cityNm.equals(kaisenCityNm)
				&& oaztsuNm.equals(kaisenOaztsuNm)
				&& azchoNm.equals(kaisenAzchoNm)))
		{

			if (!adCd.equals(kaisenAdCd))
			{
				// 住所コード、住所名称のNGの場合は埋め込み文字を切り替える
				result = NG_ADCD;
			}
			else if(!pcd.equals(kaisenPcd))
			{
				result = NG_PCD;
			}
			else if(!(stateNm.equals(kaisenStateNm) &&
							cityNm.equals(kaisenCityNm) &&
							oaztsuNm.equals(kaisenOaztsuNm) &&
							azchoNm.equals(kaisenAzchoNm)))
			{
				result = NG_MEISHO;
			}
		}

		
		return result;
	}

	/**
	 * <p>
	 * 住所コード最下層チェックを行う。(緊急通報用住所)
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param emgAdList   リスト
	 * @param i           行番号
	 * @return 住所コード最下層チェック結果
	 */
	private String adCdMostBottomPri(CAANMsg inMsg, CAANMsg[] emgAdList , int i)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 引数設定
		String adcd = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AD_CD);
		String pcd = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_HOSEI_PCD);
		String azacho = emgAdList[i].getString(EKK1071C151CBSMsg1List.EMG_AZCHO_NM);

		// 回線場所住所未確定フラグが"1"（未確定）の場合、チェック結果OKを返却する
		if (MI_FIX_FLG_MI.equals(inMsg.getString(EKK1071C151CBSMsg.KISN_PLC_AD_MI_FIX_FLG)))
		{
			return CHECK_OK;
		}

		// 緊急通報用字丁目名が設定されている場合、チェック結果OKを返却する
		if (!inMsg.isNull(azacho))
		{
			return CHECK_OK;
		}

		// 住所コード最下層チェックを行う
		Object resultBtm = kk1071.adCdMostBottom(inMsg, adcd, pcd);

		// 警告が返却された場合
		if (CHECK_WG.equals(resultBtm))
		{
			return WG_AD_KASO;
		}

		return CHECK_OK;
	}

	/**
	 * <p>
	 * 審査詳細の登録を行います（住所不備電話番号情報審査チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param jgeDtlSbtCd 審査詳細種別コード
	 * @param umkmMoji メッセージ埋め込み文字
	 * @param errIdx   明細行
	 * @param msgId    メッセージID
	 */
	public void createisAdHbiOkForTelInf(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, String jgeDtlSbtCd,
			String umkmMoji, int errIdx, String msgId)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C151CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, jgeDtlSbtCd);

		// 明細1件目でエラーとなった場合、審査対象画面タブコードに「電話１」を設定する
		if (errIdx == 0)
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL1);
		}
		else
		{
			inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_TEL2);
		}

		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, UDGE_TG_SCREEN_KMK_CD_AD_HBI);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, msgId);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, umkmMoji);

		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C151CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C151CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}

	/**
	 * <p>
	 * 引数がnullの場合、空文字("")に置換します。
	 * </p>
	 * @param param  パラメータ
	 * @return 引数返却
	 */
	private String replaceEmp(String param)
	{
		if (param == null)
		{
			return "";
		}
		return param;
	}
}
