/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKCKejbAddressRelationChk
*	ソースファイル名：JKKCKejbAddressRelationChk.java
*	作成者			：富士通
*	日付			：2012年4月9日
*＜機能概要＞
*	住所コード入力パターン単関連チェック部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/04/09	富士通		新規作成
*
**********************************************************************/
package eo.ejb.common.itemrelation;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

public class JKKejbAddressRelationChk
{
	/** 住所入力のパターン */
	private final int PATTERN1 = 1;
	private final int PATTERN2 = 2;
	private final int PATTERN3 = 3;
	private final int PATTERN4 = 4;
	private final int PATTERN5 = 5;
	
	/** 接尾語：_err */
	private final String ERR = "_err";
	
	/** 手動入力フラグ：0 */
	private static final String INPUT_FLG_ZERO = "0";
	
	/**
	 * 住所入力チェック（明細）を行います。
	 * 
 	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param arg1 Agentから渡されたAgentDispatchContext
	 * @param msgList 明細項目格納Key名
	 * @param errFlg エラーフラグ
	 * @param ad_cd 住所コード
	 * @param state_nm 都道府県名
	 * @param city_nm 市区町村名
	 * @param oaztsu_nm 大字通称名
	 * @param azcho_nm 字丁目名
	 * @param bnchigo 番地号
	 * @return true:チェック正常 false:エラー
	 */
	public boolean isAddressInputListCheck(CAANMsg inCBSMsg, AgentDispatchContext arg1, String msgList, String errFlg, String ad_cd, String state_nm, String city_nm,
			String oaztsu_nm, String azcho_nm, String bnchigo) {

		// ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheck#Start");
		
		// 明細からキーを取得
		CAANMsg[] cbsMsgList = new CAANMsg[]{};
		if (inCBSMsg.isNull(msgList))
		{
			// 明細項目に値がない場合は正常終了
			// ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheck#Input List is Null. NO Check.");
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheck#End");
			return true;
		}
		cbsMsgList = inCBSMsg.getCAANMsgList(msgList);
		
		// エラー存在判定フラグ
		boolean retBol = true;
		// 住所コードエラー設定フラグ
		boolean addCdErrFlg = true;
		
		// 明細分チェックを行います。
		for (int i = 0; cbsMsgList.length > i; i++)
		{
			// ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "KEY-VALUEList = errFlg = [ " + errFlg + " ] ad_cd = [ "
					+ cbsMsgList[i].getString(ad_cd) + " ] state_nm = [ " + cbsMsgList[i].getString(state_nm) + " ] city_nm = [ "
					+ cbsMsgList[i].getString(city_nm) + " ] oaztsu_nm = [ " + cbsMsgList[i].getString(oaztsu_nm) + " ] azcho_nm = [ "
					+ cbsMsgList[i].getString(azcho_nm) + " ] bnchigo = [ " + cbsMsgList[i].getString(bnchigo) + " ]");
			
			// 住所コードが未入力の場合、次を探しに行く
			if(cbsMsgList[i].getString(ad_cd) == null) {
				continue;
			}
			
			// 住所コードの入力パターンを取得します
			int addCdInputPat = patterAddCd(cbsMsgList[i].getString(ad_cd));
			
			// 都道府県のチェックを行います。
			if (!isTodoufukenKetaChk(addCdInputPat, cbsMsgList[i].getString(state_nm)))
			{
				cbsMsgList[i].set(state_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), state_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}
			
			// 市区町村桁数チェック
			if (!isShikuTyouSonKetaChk(addCdInputPat, cbsMsgList[i].getString(city_nm)))
			{
				cbsMsgList[i].set(city_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), city_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}
			
			// 大字通称名桁数チェック
			if (!isOoazaTuusyouKetaChk(addCdInputPat, cbsMsgList[i].getString(oaztsu_nm)))
			{
				cbsMsgList[i].set(oaztsu_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), oaztsu_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// 字丁目桁数チェック
			if (!isAzaTyoumeKetaChk(addCdInputPat, cbsMsgList[i].getString(azcho_nm)))
			{
				cbsMsgList[i].set(azcho_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), azcho_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// 番地号桁数チェック
			if (!isBantiGouKetaChk(addCdInputPat, cbsMsgList[i].getString(bnchigo)))
			{
				cbsMsgList[i].set(bnchigo + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), bnchigo + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}
			
			// エラー判定フラグにfalseが設定されている場合
			if(!addCdErrFlg) {
				// 住所コードにもエラーを設定する
				cbsMsgList[i].set(ad_cd + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), ad_cd + ERR + ":" + errFlg);
				addCdErrFlg = true;
			}
		}
		// ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheck#End");
		
		return retBol;
	}
	
	/**
	 * 住所入力チェックを行います。
	 * 
 	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param arg1 Agentから渡されたAgentDispatchContext
	 * @param ad_cd 住所コード
	 * @param state_nm 都道府県名
	 * @param city_nm 市区町村名
	 * @param oaztsu_nm 大字通称名
	 * @param azcho_nm 字丁目名
	 * @param bnchigo 番地号
	 * @return true:チェック正常 false:エラー
	 */
	public boolean isAddressInputCheck(CAANMsg inCBSMsg, AgentDispatchContext arg1, String errFlg, String ad_cd, String state_nm, String city_nm,
			String oaztsu_nm, String azcho_nm, String bnchigo)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputCheck#Start");

		// 住所コードが未入力の場合、正常終了
		if (inCBSMsg.getString(ad_cd) == null)
		{
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputCheck#AddressCode InputValue is Null. NO Check. ");
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputCheck#End");
			return true;
		}
		
		// ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "KEY-VALUEList = errFlg = [ " + errFlg + " ] ad_cd = [ " + inCBSMsg.getString(ad_cd)
				+ " ] state_nm = [ " + inCBSMsg.getString(state_nm) + " ] city_nm = [ " + inCBSMsg.getString(city_nm) + " ] oaztsu_nm = [ "
				+ inCBSMsg.getString(oaztsu_nm) + " ] azcho_nm = [ " + inCBSMsg.getString(azcho_nm) + " ] bnchigo = [ " + inCBSMsg.getString(bnchigo)
				+ " ]");

		// 住所コードの入力パターンを取得します
		int addCdInputPat = patterAddCd(inCBSMsg.getString(ad_cd));

		// エラー存在フラグ
		boolean retBol = true;

		// 住所コードの入力パターン別に各項目の桁数をチェックする
		// 都道府県桁数チェック
		if (!isTodoufukenKetaChk(addCdInputPat, inCBSMsg.getString(state_nm)))
		{
			inCBSMsg.set(state_nm + ERR, errFlg);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), state_nm + ERR + ":" + errFlg);
			retBol = false;
		}

		// 市区町村桁数チェック
		if (!isShikuTyouSonKetaChk(addCdInputPat, inCBSMsg.getString(city_nm)))
		{
			inCBSMsg.set(city_nm + ERR, errFlg);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), city_nm + ERR + ":" + errFlg);
			retBol = false;
		}

		// 大字通称名桁数チェック
		if (!isOoazaTuusyouKetaChk(addCdInputPat, inCBSMsg.getString(oaztsu_nm)))
		{
			inCBSMsg.set(oaztsu_nm + ERR, errFlg);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), oaztsu_nm + ERR + ":" + errFlg);
			retBol = false;
		}

		// 字丁目桁数チェック
		if (!isAzaTyoumeKetaChk(addCdInputPat, inCBSMsg.getString(azcho_nm)))
		{
			inCBSMsg.set(azcho_nm + ERR, errFlg);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), azcho_nm + ERR + ":" + errFlg);
			retBol = false;
		}

		// 番地号桁数チェック
		if (!isBantiGouKetaChk(addCdInputPat, inCBSMsg.getString(bnchigo)))
		{
			inCBSMsg.set(bnchigo + ERR, errFlg);
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), bnchigo + ERR + ":" + errFlg);
			retBol = false;
		}

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputCheck#End");
		return retBol;
	}
	
	/**
	 * 住所コードの入力パターンを返却します
	 * 
	 * @param ad_cd 住所コード
	 * @return int 1:xx-xxx-xxx-xxx 2：xx-xxx-xxx-000 3：xx-xxx-000-000 4：xx-000-000-000 5：00-000-000-000
	 */
	private int patterAddCd(String add_cd) {
		
		// xx-xxx-xxx-xxxに分割する
		String add01 = add_cd.substring(0, 2);
		String add02 = add_cd.substring(2, 5);
		String add03 = add_cd.substring(5, 8);
		String add04 = add_cd.substring(8, 11);
		
		if (add01.equals("00") && add02.equals("000") && add03.equals("000") && add04.equals("000"))
		{
			// 00-000-000-000の場合
			return PATTERN5;
		}
		else if (!add01.equals("00") && add02.equals("000") && add03.equals("000") && add04.equals("000"))
		{
			// xx-000-000-000の場合
			return PATTERN4;
		}
		else if (!add01.equals("00") && !add02.equals("000") && add03.equals("000") && add04.equals("000"))
		{
			// xx-xxx-000-000の場合
			return PATTERN3;
		}
		else if (!add01.equals("00") && !add02.equals("000") && !add03.equals("000") && add04.equals("000"))
		{
			// xx-xxx-xxx-000の場合
			return PATTERN2;
		}
		else
		{
			// xx-xxx-xxx-xxxの場合
			return PATTERN1;
		}
	}
	
	/**
	 * 都道府県の桁数チェックを行います。
	 * 
	 * @param addCdPattern 住所コード入力パターン
	 * @param state_nm 都道府県
	 * @return boolean true：正常 false:エラー
	 */
	private boolean isTodoufukenKetaChk(int addCdPattern, String state_nm)
	{
		int len;
		// 都道府県の桁数を取得
		if(state_nm == null) {
			len = 0;
		} else {
			len = state_nm.length();
		}
		// 「xx-xxx-xxx-xxx」「xx-xxx-xxx-000」「xx-xxx-000-000」「xx-000-000-000」の場合
		if (addCdPattern == PATTERN1 || addCdPattern == PATTERN2 || addCdPattern == PATTERN3 || addCdPattern == PATTERN4)
		{
			// 都道府県の桁数が4桁以下の場合
			if(len <= 4) return true;
		}
		// 「00-000-000-000」の場合
		else
		{
			// 都道府県の桁数が0桁(未入力)の場合
			if(len == 0) return true;
		}
		return false;
	}
	
	/**
	 * 市区町村の桁数チェックを行います。
	 * 
	 * @param addCdPattern 住所コード入力パターン
	 * @param city_nm 市区町村
	 * @return boolean true：正常 false:エラー
	 */
	private boolean isShikuTyouSonKetaChk(int addCdPattern, String city_nm) 
	{
		int len;
		// 市区町村の桁数を取得
		if(city_nm == null) {
			len = 0;
		} else {
			len = city_nm.length();
		}
		// 「xx-xxx-xxx-xxx」「xx-xxx-xxx-000」「xx-xxx-000-000」の場合
		if (addCdPattern == PATTERN1 || addCdPattern == PATTERN2 || addCdPattern == PATTERN3)
		{
			// 市区町村の桁数が12桁以下の場合
			if(len <= 12) return true;
		}
		// 「xx-000-000-000」「00-000-000-000」の場合
		else
		{
			// 市区町村の桁数が0桁(未入力)の場合
			if(len == 0) return true;
		}
		return false;
	}
	
	/**
	 * 大字通称の桁数チェックを行います。
	 * 
	 * @param addCdPattern 住所コード入力パターン
	 * @param oaztsu_nm 大字通称
	 * @return boolean true：正常 false:エラー
	 */
	private boolean isOoazaTuusyouKetaChk(int addCdPattern, String oaztsu_nm) 
	{
		int len;
		// 大字通称の桁数を取得
		if(oaztsu_nm == null) {
			len = 0;
		} else {
			len = oaztsu_nm.length();
		}
		// 「xx-xxx-xxx-xxx」「xx-xxx-xxx-000」の場合
		if (addCdPattern == PATTERN1 || addCdPattern == PATTERN2)
		{
			// 大字通称の桁数が18桁以下の場合
			if(len <= 18) return true;
		}
		// 「xx-xxx-000-000」「xx-000-000-000」「00-000-000-000」の場合
		else
		{
			// 大字通称の桁数が0桁(未入力)の場合
			if(len == 0) return true;
		}
		return false;
	}
	
	/**
	 * 字丁目の桁数チェックを行います。
	 * 
	 * @param addCdPattern 住所コード入力パターン
	 * @param azcho_nm 字丁目
	 * @return boolean true：正常 false:エラー
	 */
	private boolean isAzaTyoumeKetaChk(int addCdPattern, String azcho_nm) 
	{
		int len;
		// 字丁目の桁数を取得
		if(azcho_nm == null) {
			len = 0;
		} else {
			len = azcho_nm.length();
		}
		// 「xx-xxx-xxx-xxx」の場合
		if (addCdPattern == PATTERN1)
		{
			// 字丁目の桁数が12桁以下の場合
			if (len <= 12) return true;
		}
		// 「xx-xxx-xxx-000」「xx-xxx-000-000」「xx-000-000-000」「00-000-000-000」の場合
		else
		{
			// 字丁目の桁数が0桁(未入力)の場合
			if(len == 0) return true;
		}
		return false;
	}
	
	/**
	 * 番地号の桁数チェックを行います。
	 * 
	 * @param addCdPattern 住所コード入力パターン
	 * @param bnchigo 番地号
	 * @return boolean true：正常 false:エラー
	 */
	private boolean isBantiGouKetaChk(int addCdPattern, String bnchigo) 
	{
		int len;
		// 番地号の桁数を取得
		if(bnchigo == null) {
			len = 0;
		} else {
			len = bnchigo.length();
		}
		// 「xx-xxx-xxx-xxx」の場合
		if (addCdPattern == PATTERN1)
		{
			// 番地号の桁数が0〜15桁の場合
			if(len <= 15) return true;
		}
		// 「xx-xxx-xxx-000」「00-000-000-000」の場合
		else if(addCdPattern == PATTERN2) 
		{
			// 番地号の桁数が0〜27桁の場合
			if(len <= 27) return true;
		}
		//「xx-xxx-000-000」の場合
		else if (addCdPattern == PATTERN3)
		{
			// 番地号の桁数が0〜45桁の場合
			if (len <= 45) return true;
		}
		// 「xx-000-000-000」の場合
		else if(addCdPattern == PATTERN4){
			// 番地号の桁数が0〜57桁の場合
			if (len <= 57) return true;
		}
		// 「00-000-000-000」の場合
		else if(addCdPattern == PATTERN5) {
			// 番地号の桁数が0〜61桁の場合
			if (len <= 61) return true;
		}
		return false;
	}
	
	/**
	 * 住所入力チェック（明細_手動フラグ有）を行います。
	 * 
 	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param arg1 Agentから渡されたAgentDispatchContext
	 * @param msgList 明細項目格納Key名
	 * @param errFlg エラーフラグ
	 * @param ad_cd 住所コード
	 * @param state_nm 都道府県名
	 * @param city_nm 市区町村名
	 * @param oaztsu_nm 大字通称名
	 * @param azcho_nm 字丁目名
	 * @param bnchigo 番地号
	 * @param input_flg 手動入力フラグ
	 * @return true:チェック正常 false:エラー
	 */
	public boolean isAddressInputListCheckInpFlg(CAANMsg inCBSMsg, AgentDispatchContext arg1, String msgList, String errFlg, String ad_cd, String state_nm,
			String city_nm, String oaztsu_nm, String azcho_nm, String bnchigo, String input_flg)
	{

		// ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheckInpFlg#Start");

		// 明細からキーを取得
		CAANMsg[] cbsMsgList = new CAANMsg[]{};
		if (inCBSMsg.isNull(msgList))
		{
			// 明細項目に値がない場合は正常終了
			// ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheckInpFlg#Input List is Null. NO Check.");
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheckInpFlg#End");
			return true;
		}
		cbsMsgList = inCBSMsg.getCAANMsgList(msgList);

		// エラー存在判定フラグ
		boolean retBol = true;
		// 住所コードエラー設定フラグ
		boolean addCdErrFlg = true;

		// 明細分チェックを行います。
		for (int i = 0; cbsMsgList.length > i; i++)
		{
			// ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "KEY-VALUEList = errFlg = [ " + errFlg + " ] ad_cd = [ "
					+ cbsMsgList[i].getString(ad_cd) + " ] state_nm = [ " + cbsMsgList[i].getString(state_nm) + " ] city_nm = [ "
					+ cbsMsgList[i].getString(city_nm) + " ] oaztsu_nm = [ " + cbsMsgList[i].getString(oaztsu_nm) + " ] azcho_nm = [ "
					+ cbsMsgList[i].getString(azcho_nm) + " ] bnchigo = [ " + cbsMsgList[i].getString(bnchigo) + " ] input_flg = [ "
					+ cbsMsgList[i].getString(input_flg) + " ]");

			// 住所コードが未入力の場合、次を探しに行く
			if (cbsMsgList[i].getString(ad_cd) == null)
			{
				continue;
			}

			// 手動入力フラグが0以外の場合、次を探しにいく
			if (!INPUT_FLG_ZERO.equals(cbsMsgList[i].getString(input_flg)))
			{
				continue;
			}

			// 住所コードの入力パターンを取得します
			int addCdInputPat = patterAddCd(cbsMsgList[i].getString(ad_cd));

			// 都道府県のチェックを行います。
			if (!isTodoufukenKetaChk(addCdInputPat, cbsMsgList[i].getString(state_nm)))
			{
				cbsMsgList[i].set(state_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), state_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// 市区町村桁数チェック
			if (!isShikuTyouSonKetaChk(addCdInputPat, cbsMsgList[i].getString(city_nm)))
			{
				cbsMsgList[i].set(city_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), city_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// 大字通称名桁数チェック
			if (!isOoazaTuusyouKetaChk(addCdInputPat, cbsMsgList[i].getString(oaztsu_nm)))
			{
				cbsMsgList[i].set(oaztsu_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), oaztsu_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// 字丁目桁数チェック
			if (!isAzaTyoumeKetaChk(addCdInputPat, cbsMsgList[i].getString(azcho_nm)))
			{
				cbsMsgList[i].set(azcho_nm + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), azcho_nm + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// 番地号桁数チェック
			if (!isBantiGouKetaChk(addCdInputPat, cbsMsgList[i].getString(bnchigo)))
			{
				cbsMsgList[i].set(bnchigo + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), bnchigo + ERR + ":" + errFlg);
				retBol = false;
				addCdErrFlg = false;
			}

			// エラー判定フラグにfalseが設定されている場合
			if (!addCdErrFlg)
			{
				// 住所コードにもエラーを設定する
				cbsMsgList[i].set(ad_cd + ERR, errFlg);
				JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), ad_cd + ERR + ":" + errFlg);
				addCdErrFlg = true;
			}
		}
		// ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "isAddressInputListCheckInpFlg#End");

		return retBol;
	}
}
