/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：KKA134SFLogic
*   ソースファイル名：KKA134SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年12月19日
*＜機能概要＞
*   現サービス情報照会要求受付(API)のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/19   FJ          新規作成
*   v3.00.00    2012/08/18   FJ) 団     「ANK-0046-01-00」対応、業務処理名修正
*   v4.00.00    2012/09/07   FJ) 団     「ANK-0546-02-00」対応
*
**********************************************************************/

package eo.web.webview.KKA134SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.util.JPCEditString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.common.JKKApiCommon;
import eo.web.webview.mapping.KKSV0339_KKSV0339OPDBMapper;

/**
 * KKA134のビューロジックです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class KKA134SFLogic extends JCCWebBusinessLogic
{

	/**
	 * 業務処理名
	 */
	private static final String BUSINESS_LOGIC_NM = "現サービス情報照会要求受付";

	/**
	 * 現サービス情報照会要求受付処理です。
	 * <br>
	 * @return 処理の成否
	 * @throws Exception エラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		StringBuffer rspMsg = new StringBuffer();

		try
		{
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();

			X31SDataBeanAccess commonBean = super.getCommonInfoBean();
			
			// ■ 業務規制チェック
			if (!JKKApiCommon.checkRequestRestriction(commonBean))
			{
				// 規制中の場合
				DEBUG_LOG.debug("■業務規制エラー");
				
				// "M" "007001"（メンテナンス中エラー）
				Exception ex = new Exception("メンテナンス中です。");

				// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

				HashMap<String, Object> errMap = new HashMap<String, Object>();
				errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype("007001"));
				errMap.put("WDA_COM_RESULT", "007001");
				errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
				errMap.put("WDA_COM_DETAIL2", line_num);
				errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
				errMap.put("WDA_COM_DETAIL4", "");
				errMap.put("WDA_COM_DETAIL5", "");
				errMap.put("WDA_COM_DETAIL6", "顧客サーバ");

				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));

				// 返却値の設定
				bean.sendMessageString(KKA134SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}

			// ■ 処理要求電文より、パラメータを取得する。
			HashMap<String, Object> reqMap = super.getRequestParams();

			ArrayList<String> resultNull = chkNull(reqMap);

			// ■ 必須入力チェック
			if (resultNull != null && resultNull.size() != 0)
			{
				DEBUG_LOG.debug("■必須項目が設定されていません。");
				
				// "E" "009008"（必須項目が未設定の場合）
				Exception ex = new Exception("必須項目が設定されていません。");

				// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

				HashMap<String, Object> errMap = new HashMap<String, Object>();
				errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype("009008"));
				errMap.put("WDA_COM_RESULT", "009008");
				errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
				errMap.put("WDA_COM_DETAIL2", line_num);
				errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
				errMap.put("WDA_COM_DETAIL4", resultNull.get(0));
				errMap.put("WDA_COM_DETAIL5", "");
				errMap.put("WDA_COM_DETAIL6", "");

				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));

				// 返却値の設定
				bean.sendMessageString(KKA134SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}

			ArrayList<String> resultKeta = chkKeta(reqMap);

			// ■ 最大桁数チェック(サービス契約番号が10桁を超えた場合)
			if (resultKeta != null && resultKeta.size() != 0)
			{
				DEBUG_LOG.debug("■最大桁数を超えています。");
				
				// "E" "009010"（パラメータ値の最大桁数を超えた場合）
				Exception ex = new Exception("最大桁数を超えています。");

				// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

				HashMap<String, Object> errMap = new HashMap<String, Object>();
				errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype("009010"));
				errMap.put("WDA_COM_RESULT", "009010");
				errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
				errMap.put("WDA_COM_DETAIL2", line_num);
				errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
				errMap.put("WDA_COM_DETAIL4", resultKeta.get(0));
				errMap.put("WDA_COM_DETAIL5", "");
				errMap.put("WDA_COM_DETAIL6", (String)reqMap.get(resultKeta.get(0)));

				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));

				// 返却値の設定
				bean.sendMessageString(KKA134SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}

			ArrayList<String> resultZokusei = chkZokusei(reqMap);

			// ■ 数値属性チェック
			if (resultZokusei != null && resultZokusei.size() != 0)
			{
				DEBUG_LOG.debug("■数値項目に数値以外が設定されてます。");
				
				//"E" "009009"（数値項目に数値以外が設定されている場合）
				Exception ex = new Exception("数値項目に数値以外が設定されてます。");

				// 例外発生したソースコードの行番号を取得し5桁となるようにゼロ埋め
				String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

				HashMap<String, Object> errMap = new HashMap<String, Object>();
				errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype("009009"));
				errMap.put("WDA_COM_RESULT", "009009");
				errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
				errMap.put("WDA_COM_DETAIL2", line_num);
				errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
				errMap.put("WDA_COM_DETAIL4", resultZokusei.get(0));
				errMap.put("WDA_COM_DETAIL5", "");
				errMap.put("WDA_COM_DETAIL6", (String)reqMap.get(resultZokusei.get(0)));

				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(errMap));
				// 返却値の設定
				bean.sendMessageString(KKA134SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}

			// ■ サービス呼び出し準備
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0339");

			HashMap<String, HashMap<String, Object>> inputMap = new HashMap<String, HashMap<String, Object>>();
			HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();

			KKSV0339_KKSV0339OPDBMapper mapper = new KKSV0339_KKSV0339OPDBMapper();
			mapper.setKKSV033901CC(reqMap, inputMap);
			mapper.setKKSV0339WORK01(reqMap, inputMap);

			// ■ サービス呼出
			try
			{
				invokeService(paramMap, inputMap, outputMap);
			}
			catch (JCCWebServiceException jwse)
			{
				throw jwse;
			}

			// ■ サービス結果の転記
			HashMap<String, Object> comMap = new HashMap<String, Object>();
			
			// 下りのステータス（result_cd）を取得する。
			mapper.getKKSV0339WORK02(comMap, outputMap);
			String result_cd = (String)comMap.get("WDA_COM_RESULT");
			
			DEBUG_LOG.debug("■返却コード：" + result_cd);
			
			// サービスの処理結果が正常（返却コード"000000"）の場合
			if ("000000".equals(result_cd))
			{
				HashMap<String, Object> sectorData = createSectorTemplate();
				
				// サービスの実行結果を取得
				mapper.getKKSV033901CC(reqMap, outputMap, sectorData);
				
				// 処理応答電文（共通セクタ）の形式に変換
				rspMsg.append(JKKApiCommon.getCommonSector(result_cd));

				// オプション種別
				String op_sbt = (String)reqMap.get("OPSHON_SHUBT");
				
				if ("0010".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M1"), "M1"));
				}
				else if ("0020".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M2"), "M2"));
				}
				else if ("0030".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M3"), "M3"));
				}
				else if ("0040".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M4"), "M4"));
				}
				else if ("0050".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M5"), "M5"));
				}
				else if ("0060".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M6"), "M6"));
				}
				else if ("0110".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M7"), "M7"));
				}
				else if ("0160".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M8"), "M8"));
				}
				else if ("0170".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M9"), "M9"));
				}
				else if ("0190".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M10"), "M10"));
				}
				else if ("0320".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M11"), "M11"));
				}
				else if ("0350".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M12"), "M12"));
				}
				else if ("0360".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M13"), "M13"));
				}
				else if ("0370".equals(op_sbt))
				{
					// 処理応答電文（マルチパートセクタ）の形式に変換
					rspMsg.append(JKKApiCommon.getMultipleSector((ArrayList<HashMap<String, Object>>)sectorData.get("M14"), "M14"));
				}
				// 返却値の設定
				bean.sendMessageString(KKA134SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
				return true;
			}

			// 返却コード不正
			throw new Exception("処理結果コードが取得できませんでした。");

		}
		catch (Exception e)
		{
			// 処理で致命的なエラーが発生した場合
			DEBUG_LOG.debug("■致命的なエラー発生");
			
			// ■例外トレースのログ出力
			JKKApiCommon.printDebugLog(e);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(e.getStackTrace()[0].getLineNumber()), 5, false);

			HashMap<String, Object> errMap = new HashMap<String, Object>();
			errMap.put("WDA_COM_RTYPE", JKKApiCommon.getRtype("009003"));
			errMap.put("WDA_COM_RESULT", "009003");
			errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
			errMap.put("WDA_COM_DETAIL2", line_num);
			errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
			errMap.put("WDA_COM_DETAIL4", "");
			errMap.put("WDA_COM_DETAIL5", "");
			errMap.put("WDA_COM_DETAIL6", e.toString());

			// 処理応答電文（共通セクタ）の形式に変換
			rspMsg.append(JKKApiCommon.getCommonSector(errMap));

			// 返却値の設定
			bean.sendMessageString(KKA134SFConst.RSP_MSG, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
			return true;
		}
	}

	/**
	 * 入力パラメータの必須チェックを行います。
	 * <br>
	 * @param reqMap 処理対象のマップ
	 * @return エラー発生項目のリスト
	 */
	private ArrayList<String> chkNull(HashMap<String, Object> reqMap)
	{
		ArrayList<String> errKey = new ArrayList<String>();
		if (JKKApiCommon.isNull((String)reqMap.get("OKYAKSM_ID")))
		{
			errKey.add("OKYAKSM_ID");
		}
		if (JKKApiCommon.isNull((String)reqMap.get("OPSHON_SHUBT")))
		{
			errKey.add("OPSHON_SHUBT");
		}
		if (JKKApiCommon.isNull((String)reqMap.get("SEARCH_FLG")))
		{
			errKey.add("SEARCH_FLG");
		}
		if (JKKApiCommon.isNull((String)reqMap.get("OUT_FLG")))
		{
			errKey.add("OUT_FLG");
		}
		return errKey;
	}

	/**
	 * 現入力パラメータの桁数チェック(最大値)を行います。
	 * <br>
	 * @param reqMap 処理対象のマップ
	 * @return エラー発生項目のリスト
	 */
	private ArrayList<String> chkKeta(HashMap<String, Object> reqMap)
	{
		ArrayList<String> errKey = new ArrayList<String>();
		if (10 < ((String)reqMap.get("OKYAKSM_ID")).length())
		{
			errKey.add("OKYAKSM_ID");
		}
		if (4 < ((String)reqMap.get("OPSHON_SHUBT")).length())
		{
			errKey.add("OPSHON_SHUBT");
		}
		if (1 < ((String)reqMap.get("SEARCH_FLG")).length())
		{
			errKey.add("SEARCH_FLG");
		}
		if (1 < ((String)reqMap.get("OUT_FLG")).length())
		{
			errKey.add("OUT_FLG");
		}
		return errKey;
	}

	/**
	 * 入力パラメータの属性チェック(数値)を行います。
	 * <br>
	 * @param reqMap 処理対象のマップ
	 * @return エラー発生項目のリスト
	 */
	private ArrayList<String> chkZokusei(HashMap<String, Object> reqMap)
	{
		ArrayList<String> errKey = new ArrayList<String>();
		if (!JKKApiCommon.isNumber((String)reqMap.get("SEARCH_FLG")))
		{
			errKey.add("SEARCH_FLG");
		}
		if (!JKKApiCommon.isNumber((String)reqMap.get("OUT_FLG")))
		{
			errKey.add("OUT_FLG");
		}
		return errKey;
	}

	/**
	 * 下りセクター情報の雛型を生成する。
	 * @return HashMap<String, Object>
	 */
	private HashMap<String, Object> createSectorTemplate()
	{
		HashMap<String, Object> sectorTemplate = new HashMap<String, Object>();
		
		sectorTemplate.put("M1", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M2", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M3", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M4", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M5", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M6", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M7", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M8", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M9", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M10", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M11", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M12", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M13", new ArrayList<HashMap<String, Object>>());
		sectorTemplate.put("M14", new ArrayList<HashMap<String, Object>>());
		
		return sectorTemplate;
	}
}
