/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CKA902SFLogic
*   ソースファイル名：CKA902SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年07月01日
*＜機能概要＞
*   名寄せお客さま情報照会連携を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/01   FJ）眞方    新規作成
*
**********************************************************************/
package eo.web.webview.CKA902SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JCKStrConst.*;
import static eo.common.util.JCKLcsCommonUtil.inArray;
import static eo.web.webview.common.JCKLcsApiCommonUtil.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.util.JCKLcsCommonUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.common.JCKWebCommon;

/**
 * 名寄せお客さま情報照会連携
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CKA902SFLogic extends JCCWebBusinessLogic
{
	/**
	 * 処理コードとサービスの対応表
	 */
	private static final Map<String, String> PROCESS_MAP = new HashMap<String, String>();

	/**
	 * サービスと必須入力エラーにする項目名の対応表
	 */
	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>();

	/**
	 * 処理コードとサービスの対応表をセットする
	 */
	static {

		/**
		 * 処理コードとサービスの対応表をセットする
		 */
		PROCESS_MAP.put("01", "CKSV9007");  // 初期eoID・グループ入会コード取得
		PROCESS_MAP.put("02", "CKSV9008");  // 旧eonet接続会員リスト取得
		PROCESS_MAP.put("03", "CKSV9009");  // 回線契約者取得

		/**
		 * 処理区分,業務区分ごとの必須入力項目の定義
		 */
		REQUIRE_MAP.put("01,*", new String[]{"BUSINESS_DIV"});
		REQUIRE_MAP.put("01,0", new String[]{"SYS_ID"});
		REQUIRE_MAP.put("01,1", new String[]{"OKYAKUSAMA_ID"});
		REQUIRE_MAP.put("02,*", new String[]{"SYS_ID", "EO_ID"});
		REQUIRE_MAP.put("03,*", new String[]{"SYS_ID"});

		/**
		 * 単項目、単項目関連チェックエラー時の戻りコード
		 */
		DOMAIN_ERR_MAP.put("01", "92");
		DOMAIN_ERR_MAP.put("02", "92");
		DOMAIN_ERR_MAP.put("03", "92");

	}

	/**
	 * 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);
		}

		// サービス呼び出しの際の引数を生成
		HashMap paramMap = new HashMap();
		HashMap inputMap = new HashMap();
		HashMap outputMap = new HashMap();

		try
		{
			// リクエストデータ取得
			Map receiveMap = (Map)getReceiveXmlFromPmp(getSessionId()).get("LKA12010_RECEIVE");

			// 不正リクエスト/必須入力チェック
			String checkReturnCd = checkRequest(REQUIRE_MAP, receiveMap);
			if (checkReturnCd != null)
			{
				return setErrorXml(bean, returnMap, checkReturnCd);
			}

			// 照会用サービスIDの取得
			String processDiv = (String)JCKWebCommon.getObjFromMap(receiveMap, "PROCESS_DIV");
			String businessDiv = (String)JCKWebCommon.getObjFromMap(receiveMap, "BUSINESS_DIV");
			String serviceId = PROCESS_MAP.get(processDiv);

			// 業務区分チェック
			if (!checkGyomuKbn(PROCESS_MAP, processDiv, businessDiv))
			{
				return setErrorXml(bean, returnMap, PMP_ERR_PARAM);
			}

			// サービスへ入力パラメータをセット
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, serviceId);
			paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, serviceId + "OP");
			createServiceMap(serviceId, receiveMap, inputMap);

			// サービスの呼出
			X31CMessageResult msgResult = callService(this, paramMap, inputMap, outputMap);

			// エラー処理 
			if(msgResult != null)
			{
				return setErrorXml(bean, returnMap, getReturnCdForSvcErr(DOMAIN_ERR_MAP, processDiv, msgResult));
			}

			// 正常終了
			return setResultXml(bean, returnMap, processDiv, businessDiv, outputMap);
		}
		catch (Exception e)
		{
			printErrorLog("名寄せお客さま情報照会連携で例外が発生しました", e);
			return setErrorXml(bean, returnMap, PMP_ERR_SYSTEM);
		}
	}

	/**
	 * 返却用マップの作成と初期化<br />
	 * @return 返却用マップ
	 */
	@SuppressWarnings("unchecked")
	private Map createReturnMap()
	{
		Map returnMap  = new LinkedHashMap();
		returnMap.put("SYS_ID", "");
		returnMap.put("MEMBER_DIV", "");
		returnMap.put("DEFAULT_CONTENTS_AGREEMENT_FLG", "");
		returnMap.put("REGIST_FLG", "");
		returnMap.put("AUTH_OKYAKUSAMA_ID", "");
		returnMap.put("ICS_IDENTICAL_DATA_DIV", "");
		returnMap.put("INIT_EO_ID", "");
		returnMap.put("INIT_EO_ID_PASSWORD", "");
		returnMap.put("FAMILY_CODE", "");
		returnMap.put("FAMILY_CODE_PASSWORD", "");
		returnMap.put("OLD_EONET_MEMBER_LIST", new ArrayList());
		returnMap.put("RETURN_CODE", "");
		return returnMap;
	}

	/**
	 * 処理区分、業務区分チェック。<br />
	 * @param processDiv 処理区分
	 * @param businessDiv 業務区分
	 * @return チェック結果(true:チェックOK、false:チェックNG)
	 */
	@SuppressWarnings("unchecked")
	private boolean checkGyomuKbn(Map processMap, String processDiv, String businessDiv)
	{
		// 想定外の処理区分の時はエラー
		if (!processMap.containsKey(processDiv))
		{
			return false;
		}
		// 業務区分チェック(初期eoID・グループ入会コード取得)
		else if ("01".equals(processDiv) && (!inArray(businessDiv, "0", "1")))
		{
			return false;
		}
		return true;
	}

	/**
	 * 返却用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 serviceId
	 * @param receiveMap
	 * @param inputMap
	 */
	@SuppressWarnings("unchecked")
	private void createServiceMap(String serviceId, Map receiveMap, Map inputMap)
	{

		// 初期eoID・グループ入会コード取得の時
		if ("CKSV9007".equals(serviceId))
		{
			HashMap<String, Object> mapSc = new HashMap<String, Object>();
			String businessDiv = (String)receiveMap.get("BUSINESS_DIV");
			if ("0".equals(businessDiv))
			{
				mapSc.put("func_code", "1");
				mapSc.put("key_func_code", "1");
			}
			else
			{
				mapSc.put("func_code", "2");
				mapSc.put("key_func_code", "2");
			}
			mapSc.put("key_sysid", receiveMap.get("SYS_ID"));
			mapSc.put("key_svc_kei_no", receiveMap.get("OKYAKUSAMA_ID"));
			inputMap.put("CKSV900701SC", mapSc);
		}

		// 旧eonet接続会員リスト取得の時
		if ("CKSV9008".equals(serviceId))
		{
			HashMap<String, Object> mapSc = new HashMap<String, Object>();
			mapSc.put("func_code", "1");
			mapSc.put("key_sysid", receiveMap.get("SYS_ID"));
			inputMap.put("CKSV900801SC", mapSc);
		}

		//回線契約者取得の時
		if ("CKSV9009".equals(serviceId))
		{
			HashMap<String, Object> mapSc = new HashMap<String, Object>();
			mapSc.put("func_code", "1");
			mapSc.put("key_sysid", receiveMap.get("SYS_ID"));
			inputMap.put("CKSV900901SC", mapSc);
		}

	}


	/**
	 * サービス呼び出しが正常終了した時の返却用XML作成
	 * @param serviceId サービスID
	 * @param outMap サービス実行結果
	 * @return 返却用XML
	 */
	@SuppressWarnings("unchecked")
	private boolean setResultXml(X31SDataBeanAccess bean, Map returnMap, String processDiv, String businessDiv, Map outMap)
	{
		// リターンコードを初期化
		String returnCode = PMP_NORMAL_END;

		// 初期eoID・グループ入会コード取得の時
		if ("01".equals(processDiv))
		{
			ArrayList<?> dataList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV900701SC", "dataList1");
			if ((dataList == null) || (dataList.isEmpty()))
			{
				// 戻り値を設定
				returnCode = PMP_ERR_NODATA; // データなし
			}
			else
			{
				// 戻り値を設定
				Map<?, ?> dataMap = (Map<?, ?>)dataList.get(0);
				returnMap.put("INIT_EO_ID", (String)JCKWebCommon.getObjFromMap(dataMap, "shk_eoid"));
				returnMap.put("INIT_EO_ID_PASSWORD", (String)JCKWebCommon.getObjFromMap(dataMap, "shk_eoid_pwd"));
				returnMap.put("FAMILY_CODE", (String)JCKWebCommon.getObjFromMap(dataMap, "grp_join_cd"));
				returnMap.put("FAMILY_CODE_PASSWORD", (String)JCKWebCommon.getObjFromMap(dataMap, "grp_join_cd_pwd"));
			}
		}

		// 旧eonet接続会員リスト取得の時
		if ("02".equals(processDiv))
		{
			ArrayList<?> dataList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV900801SC", "dataList1");
			if ((dataList == null) || (dataList.isEmpty()))
			{
				returnCode = PMP_ERR_NODATA; // データなし
			}
			else
			{
				// 並び替え
				JCKLcsCommonUtil.sortMapList(dataList, "sysid", "eoid");

				// 戻り値を設定
				List oldEonetMemberList = (List)returnMap.get("OLD_EONET_MEMBER_LIST");
				for (int i = 0; i < dataList.size(); i++)
				{
					Map dataMap = (Map<?, ?>)dataList.get(i);
					Map oldEonetMemberMap = new HashMap<String, Object>();
					Map oldEonetMemberMapRoot = new HashMap();
					oldEonetMemberMapRoot.put("OLD_EONET_MEMBER", oldEonetMemberMap);
					oldEonetMemberList.add(oldEonetMemberMapRoot);
					oldEonetMemberMap.put("SYS_ID", (String)JCKWebCommon.getObjFromMap(dataMap, "sysid"));
					oldEonetMemberMap.put("EO_ID", (String)JCKWebCommon.getObjFromMap(dataMap, "eoid"));
					oldEonetMemberMap.put("MEMBER_DIV", (String)JCKWebCommon.getObjFromMap(dataMap, "member_sbt_cd"));
				}
			}
		}

		// 回線契約者取得の時
		if ("03".equals(processDiv))
		{
			ArrayList<?> dataList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV900901SC", "dataList1");
			if ((dataList == null) || (dataList.isEmpty()))
			{
				returnCode = PMP_ERR_NODATA; // データなし
			}
			else
			{
				// 戻り値を設定
				Map<?, ?> dataMap = (Map<?, ?>)dataList.get(0);
				returnMap.put("SYS_ID", (String)JCKWebCommon.getObjFromMap(dataMap, "sysid"));
				returnMap.put("MEMBER_DIV", (String)JCKWebCommon.getObjFromMap(dataMap, "member_sbt_cd"));
				returnMap.put("DEFAULT_CONTENTS_AGREEMENT_FLG", getDefaultContentsAgreementFlg(dataMap));
				returnMap.put("REGIST_FLG", getRegistFlg(dataMap));
				returnMap.put("AUTH_OKYAKUSAMA_ID", (String)JCKWebCommon.getObjFromMap(dataMap, "old_eonetmb_ninsho_id"));
				returnMap.put("ICS_IDENTICAL_DATA_DIV", getIcsIdenticalDataDiv(dataMap));
			}
		}

		returnMap.put("RETURN_CODE", returnCode);

		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;
	}

	/**
	 * Mapから取得したサービス契約番号を元に標準コンテンツ同意フラグを
	 * 編集します。
	 * @param serviceId サービスID
	 * @param dataMap マップ
	 * @return String
	 */
	private String getDefaultContentsAgreementFlg(Map<?, ?> dataMap)
	{
		if (dataMap.containsKey("svc_kei_no"))
		{
			if ("".equals((String)JCKWebCommon.getObjFromMap(dataMap, "svc_kei_no")))
			{
				return "0";
			}
			else
			{
				return "1";
			}
		}
		else
		{
			return "0";
		}
		
	}
	
	
	/**
	 * Mapから取得したeonetID未移行フラグ、入会年月日、仮登録年月日を元に
	 * 登録フラグを編集します。
	 * @param dataMap マップ
	 * @return String
	 */
	private String getRegistFlg(Map<?, ?> dataMap)
	{
		
		String eonetidMiIkoFlg     = "";
		String joinYmd             = "";
		String kariAddYmd          = "";
		String registFlg           = "0";

		if (dataMap.containsKey("eonetid_mi_iko_flg"))
		{
			eonetidMiIkoFlg  =  (String)dataMap.get("eonetid_mi_iko_flg");
		}

		if (dataMap.containsKey("eonetid_mi_iko_flg"))
		{
			eonetidMiIkoFlg  =  (String)dataMap.get("eonetid_mi_iko_flg");
		}

		if (dataMap.containsKey("join_ymd"))
		{
			joinYmd  =  (String)dataMap.get("join_ymd");
		}

		if (dataMap.containsKey("kari_add_ymd"))
		{
			kariAddYmd  =  (String)dataMap.get("kari_add_ymd");
		}
		
		if ("1".equals(eonetidMiIkoFlg))
		{
			registFlg = "2";
		}
		else
		{
			if (("".equals(joinYmd)) && !("".equals(kariAddYmd)))
			{
				registFlg = "1";
			}
		}
		
		return registFlg;
	}
	
	/**
	 * Mapから取得したコンテンツお客様カナ名、コンテンツお客様生年月日、
	 * お客様カナ名、お客様生年月日を元にICSデータ一致区分を編集します。
	 * @param dataMap マップ
	 * @return String
	 */
	private String getIcsIdenticalDataDiv(Map<?, ?> dataMap)
	{
		
		String contCustKana         = "";
		String contCustBirthd       = "";
		String custKana             = "";
		String custBirthd           = "";

		if (dataMap.containsKey("cont_cust_kana"))
		{
			contCustKana  =  (String)dataMap.get("cont_cust_kana");
		}
		else
		{
			return "0";
		}
			
		if (dataMap.containsKey("cont_cust_birthd"))
		{
			contCustBirthd  =  (String)dataMap.get("cont_cust_birthd");
		}
		else
		{
			return "0";
		}

		if (dataMap.containsKey("cust_kana"))
		{
			custKana  =  (String)dataMap.get("cust_kana");
		}
		else
		{
			return "0";
		}

		if (dataMap.containsKey("cust_birthd"))
		{
			custBirthd  =  (String)dataMap.get("cust_birthd");
		}
		else
		{
			return "0";
		}
		
		if ((custKana.equals(contCustKana)) && (custBirthd.equals(contCustBirthd)))
		{
			return "1";
		}
		else
		{
			return "0";
		}
	}
}
