/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CKA906SFLogic
*   ソースファイル名：CKA906SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年08月01日
*＜機能概要＞
*   BBモバイルログeoID取得を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/08/01   FJ）関    新規作成
*
**********************************************************************/
package eo.web.webview.CKA906SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JCKStrConst.*;
import static eo.web.webview.common.JCKLcsApiCommonUtil.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletRequest;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.common.JCKWebCommon;

/**
 * BBモバイルログeoID取得
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CKA906SFLogic extends JCCWebBusinessLogic
{

	/**
	 * サービスと必須入力エラーにする項目名の対応表
	 */
	private static final Map<String, String[]> REQUIRE_MAP = new HashMap<String, String[]>();

	/**
	 * サービスとドメイン(形式)、桁数エラー時の戻りコードの対応表
	 */
	private static final Map<String, String> DOMAIN_ERR_MAP = new HashMap<String, String>();

	/**
	 * サービスからの戻り値、リターンコードの対応表
	 */
	private static final Map<String, String> RETURN_CODE_MAP = new HashMap<String, String>();

	/**
	 * 処理区分とサービスの対応表をセットする
	 */
	static
	{

		/**
		 * サービス毎の必須入力項目の定義
		 */
		REQUIRE_MAP.put("CKSV9047", new String[]{"FAMILY_CODE", "FAMILY_PWD"});

		/**
		 * 単項目、単項目関連チェックエラー時の戻りコード
		 */
		DOMAIN_ERR_MAP.put("CKSV9047", "92");

		/**
		 * サービスからの戻り値、リターンコードの定義
		 */
		RETURN_CODE_MAP.put("0", "00");
		RETURN_CODE_MAP.put("1", "94");
		RETURN_CODE_MAP.put("9", "99");
	}

	/**
	 * APIリクエスト時
	 * 
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean action_Init() throws Exception
	{

		DEBUG_LOG.info("action_Init Start!");

		X31SDataBeanAccess bean = getServiceFormBean();

		// 返却用マップの作成と初期化
		Map returnMap  = createReturnMap();

		// 業務規制チェック
		if (!checkRegulationForSearchApi(this))
		{
			return setErrorXml(bean, returnMap, PMP_ERR_SYSTEM);
		}

		try
		{
			// リクエストオブジェクトの取得
			ServletRequest servletRequest = getServletRequest(getSessionId());

			// リクエストデータをマップとして取得
			Map<String, String> requestParamMap = getRequestParamMap(servletRequest);

			// リクエストデータ(eoid、利用日のリスト)を取得
			List eoIdList = getParameterMapToList(requestParamMap, "eo_id");
			List riyoDateList = getParameterMapToList(requestParamMap, "riyo_date");

			// 不正リクエスト/必須入力チェック
			String returnCd = checkRequest(eoIdList, riyoDateList);
			if (!PMP_NORMAL_END.equals(returnCd))
			{
				return setErrorXml(bean, returnMap, returnCd);
			}

			// サービス呼び出しの際の引数を生成
			HashMap paramMap = new HashMap();
			HashMap inputMap = new HashMap();
			HashMap outputMap = new HashMap();

			// 処理区分、サービスIDの取得
			String serviceId = "CKSV9047";

			// サービスへのデータセット
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, serviceId);
			paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, serviceId + "OP");

			createServiceMap(serviceId , eoIdList, riyoDateList, inputMap);

			// サービスの呼出
			X31CMessageResult msgResult = callService(this, paramMap, inputMap, outputMap);

			// エラー処理 
			if(msgResult != null)
			{
				return setErrorXml(bean, returnMap, PMP_ERR_SYSTEM);
			}

			// 正常終了
			return setResultXml(bean, returnMap, outputMap);
		}
		catch (Exception e)
		{
			printErrorLog("BBモバイルログeoID連携で例外が発生しました", e);
			return setErrorXml(bean, returnMap, PMP_ERR_SYSTEM);
		}
	}

	/**
	 * 返却用マップの作成と初期化<br />
	 * @return 返却用マップ
	 */
	@SuppressWarnings("unchecked")
	private Map createReturnMap()
	{
		Map listAttrMap = new HashMap();
		listAttrMap.put("count", "0");

		Map returnMap  = new LinkedHashMap();
		returnMap.put("RETURN_CODE", "");
		returnMap.put("EO_ID_LIST", new ArrayList());
		returnMap.put("EO_ID_LIST#attr", listAttrMap);
		return returnMap;
	}

	/**
	 * 返却用XML設定(エラー時用)<br />
	 * @param bean データBean
	 * @param returnMap 返却用マップ
	 * @param returnCd リターンコード
	 * @return 処理結果(常にtrue)
	 */
	@SuppressWarnings("unchecked")
	private boolean setErrorXml(X31SDataBeanAccess bean, Map returnMap, String returnCd)
	{
		returnMap.put("RETURN_CODE", returnCd);
		String xml = JCKWebCommon.parseMapToXmlForPmp(returnMap, 1).replaceAll("\r\n","\n");
		bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, xml);

		DEBUG_LOG.info("action_Init End!");

		return true;
	}

	/**
	 * 不正リクエスト，必須入力チェック
	 * @param eoIdList
	 * @param riyoDateList
	 * @return String
	 */
	private String checkRequest(List<String> eoIdList, List<String> riyoDateList)
	{
		// リクエスト元のチェック
		if (false)
		{
			return PMP_ERR_REMOTE_ADDR;  // 次期ではリモートIPアドレスチェックは行えない

		}
		else
		{
			// eoID件数と利用年月日時分秒件数チェック
			if (eoIdList.size() != riyoDateList.size())
			{
				DEBUG_LOG.info("eoIdList.size() = " + eoIdList.size() + "、riyoDateList.size() = " + riyoDateList.size());
				return PMP_ERR_SYSTEM;  //システムエラー
			}
			// パラメータチェック
			else if (JCKWebCommon.isNullOrEmpty(eoIdList) || JCKWebCommon.isNullOrEmpty(riyoDateList))
			{
				DEBUG_LOG.info("eoIdList または riyoDateList が0件です。");
				return PMP_ERR_PARAM;  //パラメータ不正エラー
			}
			else
			{
				int errCnt = 0;
				for (int i = 0; i < eoIdList.size(); i++) {
					String eoId = eoIdList.get(i);
					String riyoDate = riyoDateList.get(i);
					if (JCKWebCommon.isNullOrBlank(eoId) || JCKWebCommon.isNullOrBlank(riyoDate)) {
						errCnt++;
					}
				}
				// 1件も正常なデータがない場合はパラメータ不正エラー
				if (errCnt == eoIdList.size()) {
					return PMP_ERR_PARAM;
				}
			}
		}

		return PMP_NORMAL_END;
	}

	/**
	 * サービスへのパラメータを作成する
	 * @param serviceId
	 * @param eoIdList
	 * @param riyoDateList
	 * @param inputMap
	 * @throws Exception
	 */
	private void createServiceMap(String serviceId, List<String> eoIdList, List<String> riyoDateList, Map<String, Object> inputMap) throws Exception
	{

		HashMap<String, Object> mapCc = new HashMap<String, Object>();
		List<HashMap<String, String>> eoIdListCc = new ArrayList<HashMap<String, String>>();
		
		for (int i = 0; i < eoIdList.size(); i++)
		{
			HashMap<String, String> dataMap = new HashMap<String, String>();
			String eoid = (String)eoIdList.get(i);
			String riyoDate = (String)riyoDateList.get(i);

			dataMap.put("eoid", eoid);
			dataMap.put("riyo_date", riyoDate);
			eoIdListCc.add(dataMap);
		}

		mapCc.put("eoidList", eoIdListCc);

		inputMap.put("CKSV904701CC", mapCc);

	}

	/**
	 * サービス呼び出しが正常終了した時の返却用XML作成
	 * @param bean データBean
	 * @param returnMap 返却用マップ
	 * @param outMap サービス実行結果
	 * @throws Exception
	 * @return 返却用XML
	 */
	@SuppressWarnings("unchecked")
	private boolean setResultXml(X31SDataBeanAccess bean, Map returnMap, Map<?, ?> outMap) throws Exception
	{
		// リターンコードを取得
		String return_cd = (String)JCKWebCommon.getObjFromMap(outMap, "CKSV904701CC", "return_cd");
		String returnCd = RETURN_CODE_MAP.get(return_cd);

		// 返却するリストを取得
		List retList = (List)returnMap.get("EO_ID_LIST");
		List<Map<String, Object>> list = (ArrayList<Map<String, Object>>)JCKWebCommon.getObjFromMap(outMap, "CKSV904701CC", "returnList");

		// 属性(リスト件数)の取得・セット
		Map listAttrMap = (Map)returnMap.get("EO_ID_LIST#attr");
		listAttrMap.put("count", ((list == null) ? "0" : list.size()));

		for (int i = 0; i < list.size(); i++)
		{
			Map listRecMap = (Map)list.get(i);
			Map retListRootMap = new HashMap();
			retList.add(retListRootMap);
			Map retListMap = new LinkedHashMap();
			retListRootMap.put("EO_ID_INFO", retListMap);
			retListMap.put("EO_ID", listRecMap.get("eoid"));
			retListMap.put("SYS_ID", listRecMap.get("sysid"));
		}

		returnMap.put("EO_ID_LIST", retList);
		returnMap.put("EO_ID_LIST#attr", listAttrMap);
		returnMap.put("RETURN_CODE", returnCd);
		String xml = JCKWebCommon.parseMapToXmlForPmp(returnMap, 1).replaceAll("\r\n", "\n");
		bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, xml);

		DEBUG_LOG.info("action_Init End!");

		return true;
	}

	/**
	 * パラメータマップをリストに設定し、返却する。<br />
	 * <pre>
	 * (補足)
	 * ・以下の形式でGET送信されたリクエストデータをリストオブジェクトに変換する。
	 * 　eo_id[0]=aaaaa&amp;eo_id[1]=bbbbb&amp;eo_id[2]=ccccc
	 * 　※上記の場合、引数(keyName)に"eoid"を指定すると、[aaaaa, bbbbb, ccccc] というリストが得られる。
	 * </pre>
	 * @param requestParamMap
	 * @param keyName
	 * @return List<String>
	 */
	private List<String> getParameterMapToList(Map<String, String> requestParamMap, String keyName)
	{
		List<String> valueList = new ArrayList<String>();
		
		Iterator<?> keyIterator = requestParamMap.keySet().iterator();
		
		while(keyIterator.hasNext())
		{
			String key = (String)keyIterator.next();
			
			if(key.equals(keyName) ||  key.matches(keyName + "\\[[0-9]*\\]"))
			{
				valueList.add(requestParamMap.get(key));
			}
			
		}
		
		return valueList;
	}
}
