package com.fujitsu.futurity.bp.custom.reqchk;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.bp.custom.common.JCCBPCommon;
import com.fujitsu.futurity.bp.x21.bpm.common.AbstractCustomReqChk;
import com.fujitsu.futurity.bp.x21.bpm.common.IConditionValue;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.reqchk.exception.ReqChkException;

import eo.common.util.JPCDateUtil;
import eo.ejb.cbs.cbsmsg.EKK0371B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg1List;

public class JKKSV021109ReqChk  extends AbstractCustomReqChk {

	/**
	 * 電話番号情報登録・光電話・電話番号情報変更の実行判定クラス
	 */
	@SuppressWarnings("unchecked")
	public boolean checkExecution(IRequestParameterReadOnly irp,
			IConditionValue conditionvalue) throws ReqChkException {
		
		//発信者番号通知「無」→「有」変更時
		HashMap<String, Object> kKSV021104SCHash;
		ArrayList<HashMap<String, Object>> ekk0371B001CBSMsg1List;
		HashMap<String, Object> ekk0371B001CBSMsg1ListElement;
		HashMap<String, Object> kKSV021109SCHash;
		ArrayList<HashMap<String, Object>> ekk0821A010CBSMsg1List;
		HashMap<String, Object> ekk0821A010CBSMsg1ListElement;
		HashMap<String, Object> KKSV021124SCHash;
		
		boolean isHBTExists;

		try{
			
			//オプションサービス契約＜電話＞一覧照会結果の取得
			kKSV021104SCHash = (HashMap<String, Object>)irp.getData("KKSV021104SC");
			ekk0371B001CBSMsg1List = (ArrayList<HashMap<String, Object>>)kKSV021104SCHash.get(EKK0371B001CBSMsg.EKK0371B001CBSMSG1LIST);
			
			//画面の結果を取得
			kKSV021109SCHash = (HashMap<String, Object>)irp.getData("KKSV021109SC");
			
			//取得したオプションサービス分だけループ
			isHBTExists = false;
			for(int i = ekk0371B001CBSMsg1List.size()-1 ; i >= 0 ; i--){
				
				String opSvcCd;
				String opSvcEndYmd;
				String opSvcStat;
				String opSvcCancelYmd;
				
				//1要素取得
				ekk0371B001CBSMsg1ListElement = (HashMap<String, Object>)ekk0371B001CBSMsg1List.get(i);
				
				// オプションサービスコードの取得
				opSvcCd = (String)ekk0371B001CBSMsg1ListElement.get(EKK0371B001CBSMsg1List.OP_SVC_CD);
				
				// オプションサービス契約ステータスの取得
				opSvcStat= (String)ekk0371B001CBSMsg1ListElement.get(EKK0371B001CBSMsg1List.OP_SVC_KEI_STAT);
				
				//オプションサービスコードが"B025"（発信者番号通知）か？
				if("B022".equals(opSvcCd))
				{
					String kaifukuKikan;
					String cancelKikan;
					
					//運用年月日
					String ope_ymd = JCCBPCommon.getOpeDate(null);
					
					//オプションサービス一意照会結果の取得
					KKSV021124SCHash = (HashMap<String, Object>)irp.getData("KKSV021124SC");
					ekk0821A010CBSMsg1List = (ArrayList<HashMap<String, Object>>)KKSV021124SCHash.get(EKK0821A010CBSMsg.EKK0821A010CBSMSG1LIST);
					
					ekk0821A010CBSMsg1ListElement = (HashMap<String, Object>)ekk0821A010CBSMsg1List.get(0);
					
					// 解約の場合
					if ("910".equals(opSvcStat))
					{
						opSvcEndYmd = (String)ekk0371B001CBSMsg1ListElement.get(EKK0371B001CBSMsg1List.SVC_ENDYMD);
						
						if (opSvcEndYmd == null || "".equals(opSvcEndYmd)) {
							isHBTExists = true;
							break;
						}
						else {
							// 該当オプションサービスの回復可能期間を取得
							kaifukuKikan = (String)ekk0821A010CBSMsg1ListElement.get(EKK0821A010CBSMsg1List.KAIHK_PSB_PRD);
							
							int kaifukukanoDay = Integer.parseInt(kaifukuKikan);
							
							// 回復可能期間日付
							String kaifukuKanoYmd = JPCDateUtil.addDay(opSvcEndYmd, kaifukukanoDay);
							
							// 存在はするが、回復可能期間を過ぎていれば、再度登録対象になる。
							if (ope_ymd.compareTo(kaifukuKanoYmd) > 0) {
								isHBTExists = false;
								break;
							} else {
								isHBTExists = true;
								break;
							}
						}
					}
					// キャンセルの場合
					else if ("920".equals(opSvcStat))
					{
						opSvcCancelYmd = (String)ekk0371B001CBSMsg1ListElement.get(EKK0371B001CBSMsg1List.SVC_CANCEL_YMD);
						
						if (opSvcCancelYmd == null || "".equals(opSvcCancelYmd)) {
							isHBTExists = true;
							break;
						}
						else {
							// 該当オプションサービスのキャンセル取消可能期間を取得
							cancelKikan = (String)ekk0821A010CBSMsg1ListElement.get(EKK0821A010CBSMsg1List.CANCEL_CL_PSB_PRD);
							
							int cancelKanoDay = Integer.parseInt(cancelKikan);
							
							// キャンセル取消可能日付
							String cancelKanoYmd = JPCDateUtil.addDay(opSvcCancelYmd, cancelKanoDay);
							
							// 存在はするが、キャンセル取消可能期間を過ぎていれば、再度登録対象になる。
							if (ope_ymd.compareTo(cancelKanoYmd) > 0) {
								isHBTExists = false;
								break;
							} else {
								isHBTExists = true;
								break;
							}
						}
					}
					// 解約、キャンセル以外の場合
					else
					{
						isHBTExists = true;
						break;
					}
				}
			}
			
			//発信者番号通知が加入済みでない場合
			if(!isHBTExists)
			{
				//画面からは「有」で設定されているか？
				if(kKSV021109SCHash.get("hs_no_tchi").equals("1"))
				{
					//以降のオプションサービスの登録へと向かう
					return true;
				}
			}
			
		}catch (Exception e) {
			return false;
		}
		
		return false;

	}

}
