/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbAdChecker
*   ソースファイル名：JKKejbAdChecker.java
*   作成者          ：富士通
*   日付            ：2012年09月05日
*＜機能概要＞
*   住所チェック共通処理部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2012/09/05  富士通      新規作成
*   v4.00.00    2013/02/08  FJ)坂本		ST3-2013-0000040
*
**********************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.util.ArrayList;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JPCAdCommonCheckUtil;
import eo.ejb.cbm.entity.ZM0081ETMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 住所チェック共通処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbAdChecker
{
	/** 住所マスタ存在チェックエラーフラグ：EA */
	private static final String AD_MST_CHK_ERR_FLG = "EA";

	/** 郵便番号整合性チェックエラーフラグ：EB */
	private static final String PCD_CONSIST_CHK_ERR_FLG = "EB";

	/** 住所最下層チェックエラーフラグ：EC */
	private static final String AD_MAXKAI_CHK_ERR_FLG = "WA";

	/** 住所チェックレベル（1：全て） */
	private static final String AD_CHK_LV_ONE = "1";

	/** 住所チェックレベル（2：最下層チェック無） */
	private static final String AD_CHK_LV_TWO = "2";

	/** 機能コード（2：チェックのみ） */
	private static final String FUNC_CODE_CHK_ONLY = "2";
	
	/** 住所コード */
	private String adCd = null;

	/** 郵便番号 */
	private String pCd = null;

	/** 手動入力フラグ */
	private String manInputFlg = null;

	/** 住所チェックレベル */
	private String adChkLv = null;

	/** エラーフラグ */
	private String errFlg = null;
	
	/** 機能コード */
	private String funcCode = null;
	
	/** 住所最下層チェック 未実施サービスIFID */
	private static ArrayList<String> adbotNonChk = new ArrayList<String>();
	static {
		adbotNonChk.add("EKK1071C011");
		adbotNonChk.add("EKK1071C031");
		adbotNonChk.add("EKK1071C051");
		adbotNonChk.add("EKK1071C061");
		adbotNonChk.add("EKK1071C151");
	}
	

	/**
	 * <p>
	 * 住所コードを取得します。
	 * </p>
	 * @return 住所コード
	 */
	private String getAdCd()
	{
		return this.adCd;
	}

	/**
	 * <p>
	 * 住所コードを設定します。
	 * </p>
	 * @param adCd 住所コード
	 */
	public void setAdCd(String adCd)
	{
		this.adCd = adCd;
	}

	/**
	 * <p>
	 * 郵便番号を取得します。
	 * </p>
	 * @return 郵便番号
	 */
	private String getPcd()
	{
		return this.pCd;
	}

	/**
	 * <p>
	 * 郵便番号を設定します。
	 * </p>
	 * @param pCd 郵便番号
	 */
	public void setPCd(String pCd)
	{
		this.pCd = pCd;
	}

	/**
	 * <p>
	 * 手動入力フラグを取得します。
	 * </p>
	 * @return 手動入力フラグ
	 */
	private String getManInputFlg()
	{
		return this.manInputFlg;
	}

	/**
	 * <p>
	 * 手動入力フラグを設定します。
	 * </p>
	 * @param manInputFlg 手動入力フラグ
	 */
	public void setManInputFlg(String manInputFlg)
	{
		this.manInputFlg = manInputFlg;
	}

	/**
	 * <p>
	 * 住所チェックレベルを取得します。
	 * </p>
	 * @return 住所チェックレベル
	 */
	private String getAdChkLv()
	{
		return this.adChkLv;
	}

	/**
	 * <p>
	 * 住所チェックレベルを設定します。
	 * </p>
	 * @param adChkLv 住所チェックレベル
	 */
	public void setAdChkLv(String adChkLv)
	{
		this.adChkLv = adChkLv;
	}

	/**
	 * <p>
	 * 機能コードを取得します。
	 * </p>
	 * @return 機能コード
	 */
	private String getFuncCode()
	{
		return funcCode;
	}

	/**
	 * <p>
	 * 機能コードを設定します。
	 * </p>
	 * @param funcCode 機能コード
	 */
	public void setFuncCode(String funcCode)
	{
		this.funcCode = funcCode;
	}

	/**
	 * <p>
	 * エラーフラグを取得します。
	 * </p>
	 * @return エラーフラグ
	 */
	public String getErrFlg()
	{
		return this.errFlg;
	}

	/**
	 * <p>
	 * エラーフラグを設定します。
	 * </p>
	 * @param errFlg エラーフラグ
	 */
	public void setErrFlg(String errFlg)
	{
		this.errFlg = errFlg;
	}

	/**
	 * <p>
	 * 新しいJKKejbAdCheckerを作成します。
	 * </p>
	 */
	public JKKejbAdChecker()
	{
	}

	/**
	 * <p>
	 * 住所チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return true：正常 , false：エラー
	*/
	public boolean isAdCheck(CAANMsg inCBSMsg)
	{
		/*
		 * 住所マスタ存在チェック
		 */
		if (!isAdMstChk(inCBSMsg, getAdCd(), getPcd(), getAdChkLv()))
		{
			// 処理を終了する
			setErrFlg(AD_MST_CHK_ERR_FLG);
			return false;
		}

		/*
		 * 郵便番号整合性チェック
		 */
		if (!isPcdConsistencyChk(inCBSMsg,  getAdCd(), getPcd(), getManInputFlg(), getAdChkLv()))
		{
			// 処理を終了する
			setErrFlg(PCD_CONSIST_CHK_ERR_FLG);
			return false;
		}

		// 機能コードが"2"(チェックのみ)でない場合、最下層チェックは行わない
		if (!FUNC_CODE_CHK_ONLY.equals(getFuncCode()))
		{
			return true;
		}
		
		/*
		 * 住所最下層チェック
		 */
		if (!isAdMaxKaiChk(inCBSMsg,  getAdCd(), getPcd(), getAdChkLv()))
		{
			// 処理を終了する
			setErrFlg(AD_MAXKAI_CHK_ERR_FLG);
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * 住所マスタ存在チェックを行います。
	 * </p>
	 * @param inCBSMsg メッセージクラス
	 * @param adCd 住所コード
	 * @param pCd 郵便番号
	 * @param adChkLv 住所チェックレベル
	 * @return true：正常、false：エラー
	 */
	public boolean isAdMstChk(CAANMsg inCBSMsg, String adCd, String pCd, String adChkLv)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JKKejbAdChecker#isAdMstChk");

		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		// コネクション
		Connection con1 = JSYejbConnection.getConnection(ZM0081ETMsg.getTableName());

		try
		{
			// 住所チェックレベルが"1"、"2"以外の場合
			if (!AD_CHK_LV_ONE.equals(adChkLv)
					&& !AD_CHK_LV_TWO.equals(adChkLv))
			{
				// 処理終了
				return true;
			}
	
			// 住所コードが未設定の場合
			if (adCd == null)
			{
				// 処理終了
				return true;
			}

			// 住所マスタ存在チェックを行う
			if (!JPCAdCommonCheckUtil.adMstSonzaiChk(con1, adCd, pCd, opeDate))
			{
				// falseを返し、処理終了
				return false;
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(con1 != null)
			{
				CAANConnectionMgr.getInstance().close(con1);
			}
			// 終了ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "END:JKKejbAdChecker#isAdMstChk");
		}
		return true;
	}

	/**
	 * <p>
	 * 郵便番号整合性チェックを行います。
	 * </p>
	 * @param inCBSMsg メッセージクラス
	 * @param adCd 住所コード
	 * @param pCd 郵便番号
	 * @param manInpFlg 手動入力フラグ
	 * @param adChkLv 住所チェックレベル
	 * @return true：正常、false：エラー
	 */
	public boolean isPcdConsistencyChk(CAANMsg inCBSMsg, String adCd, String pCd, String manInpFlg, String adChkLv)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JKKejbAdChecker#isPcdConsistencyChk");

		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		// コネクション
		Connection con1 = JSYejbConnection.getConnection(ZM0081ETMsg.getTableName());

		try
		{
			// 住所チェックレベルが"1"、"2"以外の場合
			if (!AD_CHK_LV_ONE.equals(adChkLv)
					&& !AD_CHK_LV_TWO.equals(adChkLv))
			{
				// 処理終了
				return true;
			}
	
			// 住所コード、または郵便番号が未設定の場合
			if (adCd == null || pCd == null)
			{
				// 処理終了
				return true;
			}

			// 郵便番号整合性チェックを行う
			if (!JPCAdCommonCheckUtil.pcdConsistencyChk(con1, adCd, pCd, manInpFlg, opeDate))
			{
				// falseを返し、処理終了
				return false;
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(con1 != null)
			{
				CAANConnectionMgr.getInstance().close(con1);
			}
			// 終了ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "END:JKKejbAdChecker#isPcdConsistencyChk");
		}
		return true;
	}

	/**
	 * <p>
	 * 住所最下層チェックを行います。
	 * </p>
	 * @param inCBSMsg メッセージクラス
	 * @param adCd 住所コード
	 * @param pCd 郵便番号
	 * @param adChkLv 住所チェックレベル
	 * @return true：正常、false：エラー
	 */
	public boolean isAdMaxKaiChk(CAANMsg inCBSMsg, String adCd, String pCd, String adChkLv)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JKKejbAdChecker#isAdMaxKaiChk");

		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		// コネクション
		Connection con1 = JSYejbConnection.getConnection(ZM0081ETMsg.getTableName());
		// サービスIF-ID
		String templateID = inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY);

		try
		{
			// 住所最下層チェック未実施SIFに含まれる場合
			if (adbotNonChk.contains(templateID))
			{
				return true;
			}
			
			// 住所チェックレベルが1以外の場合
			if (!AD_CHK_LV_ONE.equals(adChkLv))
			{
				// 処理終了
				return true;
			}
	
			// 住所コード、または郵便番号が未設定の場合
			if (adCd == null || pCd == null)
			{
				// 処理終了
				return true;
			}

			// 住所最下層チェックを行う
			if (!JPCAdCommonCheckUtil.adMaxKaiChk(con1, adCd, pCd, opeDate))
			{
				// falseを返し、処理終了
				return false;
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(con1 != null)
			{
				CAANConnectionMgr.getInstance().close(con1);
			}
			// 終了ログ出力
			JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "END:JKKejbAdChecker#isAdMaxKaiChk");
		}
		return true;
	}
}