/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKSV063102ReqChk
*	ソースファイル名：JKKSV063102ReqChk.java
*	作成者			：FJ
*	日付			：2012年08月20日
*＜機能概要＞
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/08/20	FJ			新規作成
*	v8.00.00	2014/03/13	FJ）福岡    OM-2014-0000094
*	v10.00.00	2014/10/07	FJ）三宅    OM-2014-0003294
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.reqchk;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

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.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.reqchk.exception.ReqChkException;

import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;


/**
 * KKSV0630_はぴe契約補正対象一覧取得<br>
 * はぴeポイント契約一覧照会SCが正常の場合のみ、以降の処理を実施する。
 * 
 * @author 富士通
 */
public class JKKSV063102ReqChk extends AbstractCustomReqChk {

	/**
	 * 
	 * はぴeポイント契約一意照会SC、はぴeポイント契約一覧再検索CCの実施判定を行う<br>
	 * <br>
	 * 
	 * @param  arg0
	 * @param  arg1
	 * @return true：正常、false：異常
	 */
	@SuppressWarnings({ "unchecked", "boxing" })
	@Override
	public boolean checkExecution(IRequestParameterReadOnly arg0, IConditionValue arg1) throws ReqChkException
	{
		boolean ret = false;
		
		// SCマップから必要な情報を取り出す
		HashMap<String, Object> parentMap;
		try 
		{
// v8.00.00 DEL START
//			parentMap = (HashMap<String, Object>)arg0.getData("KKSV063101SC");
//			
//			if (parentMap != null) {
//				//検索エラーフラグを取得
//				String flg = (String)parentMap.get("search_err_flg");
//				
//				//検索エラーフラグがnullまたは""の場合は,実施OK
//				if (flg == null || "".equals(flg)) {
//					
//					ret = true;
//				}
//			}
// v8.00.00 DEL START
// v8.00.00 ADD START
			
			// KKSV063101SC
			parentMap = (HashMap<String, Object>)arg0.getData("KKSV063101SC");
			
			// 未設定以外
			if (parentMap != null) {
				
				// 検索エラーフラグ
				String errFlg = (String) parentMap.get("search_err_flg");
				
				// チェックフラグ：（エラーあり：true、エラーなし：false）
				boolean isErrorFlg = !JKKStringUtil.isNullBlank(errFlg) && !"0".equals(errFlg);
				
				// 入力データ振り分け
				if (isHapieNo(parentMap)) {
					
					/** 入力が[はぴe番号]のみ */
					
					// エラー有りは更にチェック
					if (!isErrorFlg) {
						
						// 基本は,エラー有→おしまい.
						if (!JPCModelConstant.SEARCH_ERR_FLG_NODATA.equals(errFlg) && !JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(errFlg)) {
							
							// 当パターンは必ず結果が存在する.
							ArrayList<HashMap<String, Object>> dataList = (ArrayList)parentMap.get("EKK0671B001CBSMsg1List");
							
							ArrayList<String> pNoList    = new ArrayList<String>();
							HashMap<String, Integer> map = new HashMap<String, Integer>();
							
							// EKK0671B001CBSMsg1Listが1件の場合は,終了
							if (dataList.size() == 1)
								return true;
							
// v10.00.00 2014/10/07 ADD Start
							HashMap<String, Object> hapieKeiNoMap = new HashMap<String, Object>();
							// EKK0671B001実行結果のはぴｅ番号が１件かチェック
							// ※紐付くサービスが２件以上の場合には取得レコードが１件ではないため、上の処理（dataListのサイズチェック）に引っ掛からない
							for (HashMap<String, Object> tgMap : dataList) {
								String pNo = (String) tgMap.get("hapie_point_kei_no");
								hapieKeiNoMap.put(pNo, null);
							}
							if(hapieKeiNoMap.size() == 1)
							{
								// EKK0671B001実行結果のはぴｅ番号が１件の場合、チェックＯＫとしてtrueを返却する
								Iterator it =  hapieKeiNoMap.keySet().iterator();
								String hapiePointKeiNo = "";
								if(it.hasNext())
								{
									hapiePointKeiNo = (String)it.next();
								}
								
								// 除去して継続
								removeEKK0671B001List(dataList, hapiePointKeiNo);
								
								// dammy再設定
								HashMap dammyMap = (HashMap) arg0.getData("dammyMap");
								dammyMap.put("hapie_point_kei_no", hapiePointKeiNo);
								parentMap.put("dammyMap", dammyMap);
								
								return true;
							}
// v10.00.00 2014/10/07 ADD End
							
							// EKK0671B001CBSMsg1List
							for (HashMap<String, Object> tgMap : dataList) {
								
								String pNo = (String) tgMap.get("hapie_point_kei_no");
								String sCd = (String) tgMap.get("sksn_trgt_svkei_skekka_cd");
								
								if (map.containsKey(pNo)) {
									
									map.put(pNo, map.get(pNo) + 1);
									if ("00".equals(sCd)) pNoList.add(pNo);
									
									continue;
								}
								map.put(pNo, 1);
								if ("00".equals(sCd)) pNoList.add(pNo);
							}
							
							// マージ
							ArrayList<String> mList = margePnoList(pNoList);
							
							// 判定
							if (mList.size() == 0 || mList.size() > 1) {
								parentMap.put("search_err_flg", "4");
								return false;
							}
							
							// 除去して継続
							removeEKK0671B001List(dataList, mList.get(0));
							
							// dammy再設定
							HashMap dammyMap = (HashMap) arg0.getData("dammyMap");
							dammyMap.put("hapie_point_kei_no", mList.get(0));
							parentMap.put("dammyMap", dammyMap);
							
							return true;
						}
					}
				}
				
				// 最終判定：エラー時はおしまい.
				if (isErrorFlg) 
					return false;
				
				// ↑上記以外
				ret = true;
			}
// v8.00.00 ADD END
		}
		catch (RequestParameterException e) 
		{
			/*NOP*/
		}
		return ret;
	}
	
// v8.00.00 ADD START
	
	/**
	 * 
	 * SIFの戻り値を元の既存の形にする.
	 * 不要なレコードを特定し,remove処理を行う.
	 * 
	 * @param tgList
	 * @param key
	 */
	private void removeEKK0671B001List(ArrayList<HashMap<String, Object>> tgList, String key) {
		
		// 削除件数カウント
		int i = 0;
		for (HashMap<String, Object> tg : tgList) {
			
			String pNo = (String) tg.get("hapie_point_kei_no");
			if (key.equals(pNo)) {
				i++;
			}
		}
		
		// 削除件数特定
		int delCnt = i==0 ? 0 : i==1 ? 0 : i-1;
		
		// 削除処理開始
		Iterator<HashMap<String, Object>> ite = tgList.iterator();
		int del = 0;
		while (ite.hasNext()) {
			HashMap<String, Object> tgMap = ite.next();
			
			String pNo = (String) tgMap.get("hapie_point_kei_no");
			
			if (key.equals(pNo)) {
				
				if (delCnt > del)
					ite.remove();
				
				del++;
				continue;
			}
			
			ite.remove();
		}
	}
	
	/**
	 * 
	 * はぴeポイント契約番号Listをマージする.
	 * 
	 * @param  pNoList
	 * @return 
	 */
	private ArrayList<String> margePnoList(ArrayList<String> pNoList) {
		
		ArrayList<String> ret = new ArrayList<String>();
		
		Iterator<String> ite = pNoList.iterator();
		while (ite.hasNext()) {
			
			String pNo = ite.next();
			
			if (!ret.contains(pNo)) {
				ret.add(pNo);
			}
		}
		return ret;
	}
	
	/**
	 * 
	 * 検索条件が[はぴe番号]の場合のみ,true返却.
	 * 
	 * @param  tgMap
	 * @return 
	 */
	private  boolean isHapieNo(HashMap<String, Object> tgMap) {
		
		// ありえないが,一応NG処理
		if(tgMap == null) return false;
		
		String hapieNo = (String) tgMap.get("key_hapie_no");	// はぴe番号
		String sysid   = (String) tgMap.get("key_sysid");		// SYSID
		String eoid    = (String) tgMap.get("key_eoid");		// EOID
		
		// 判定結果保持
		boolean is1 = !JKKStringUtil.isNullBlank(hapieNo)   ? true : false;
		boolean is2 =  JKKStringUtil.isNullBlank(sysid)     ? true : false;
		boolean is3 =  JKKStringUtil.isNullBlank(eoid)      ? true : false;
		
		// 検索条件が[はぴe番号]だけである場合
		if (is1 && is2 && is3) {
			return true;
		}
		
		return false;
	}
// v8.00.00 ADD END
}
