/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCK0151TPMA
*	ソースファイル名：JCK0151TPMA.java
*	作成者			：富士通
*	日付			：2012年05月23日
*＜機能概要＞
*	指示書のサービスIF顧客独自処理部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/05/23	富士通		新規作成
*
********************************************************************************/

package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.util.JCKLcsCommonUtil;

/**
 * <p>
 * 指示書サービスIF顧客独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JCK0151TPMA implements TemplateMainHandler
{
	/**
	 * <p>
	 * 指示書サービスIF顧客独自処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		String schemaName = inCBSMsg.getSchemaName().replaceAll(".*\\.", "");
		String updType = schemaName.substring(7,8);
		String apiType = schemaName.substring(3,4);

		// 指示書情報の入力チェック
		if ("D".equals(updType) || "A".equals(apiType))
		{
			// 登録 または API連携の場合はパラメータチェックを行う
			boolean result = checkParam(inCBSMsg);
			if (!result)
			{
				throw new CAANException("指示書パラメータが誤っています。");
			}
		}
	}

	/**
	 * <p>
	 * 指示書情報の入力チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return チェック結果(true:正常、false:エラー)
	 */
	public static boolean checkParam(CAANMsg inCBSMsg)
	{
		List<String> errFields = new ArrayList<String>();

		String trnCd = inCBSMsg.getString("trn_cd");
		String trgtTableId = inCBSMsg.getString("trgt_table_id");
		String tranTrgtSysid = inCBSMsg.getString("tran_trgt_sysid");
		String parameterYkCnt = inCBSMsg.getString("parameter_yk_cnt");

		// 処理コード
		if (!JCKLcsCommonUtil.inArray(trnCd, "A01", "N01"))
		{
			errFields.add("trn_cd");
		}

		// 処理対象ＳＹＳＩＤ
		if (JCKLcsCommonUtil.isNullOrBlank(tranTrgtSysid))
		{
			errFields.add("tran_trgt_sysid");
		}

		// パラメータ有効数
		//if (JCKLcsCommonUtil.isNullOrBlank(parameterYkCnt))
		//{
		//	errFields.add("parameter_yk_cnt");
		//}

		if ("A01".equals(trnCd))
		{
			String parameter1 = inCBSMsg.getString("parameter_1");
			if ("C".equals(parameter1))
			{
				//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
			}
			else
			{
				//checkParam1to50(errFields, inCBSMsg, 3);
			}
		}
		else  if ("N01".equals(trnCd))
		{
			// 対象テーブルＩＤ
			if (JCKLcsCommonUtil.isNullOrBlank(trgtTableId))
			{
				errFields.add("trgt_table_id");
			}
			else
			{
				if ("TNM00030".equals(trgtTableId) || "TNM00030_D".equals(trgtTableId))
				{
					//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6,8,9);
				}

				else if ("TNM00040".equals(trgtTableId) || "TNM00040_D".equals(trgtTableId))
				{
					//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6,7,9,10,12,13);
				}

				else if ("TNM00050".equals(trgtTableId) || "TNM00050_D".equals(trgtTableId))
				{
					//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6,7,8,9,10,12,13);
				}

				else if ("TNM00060".equals(trgtTableId) || "TNM00060_D".equals(trgtTableId))
				{
					//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6,7,8,10,11,13);
				}

				else if ("TNM00020".equals(trgtTableId))
				{
					//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21);
				}

				else if ("TNM00020_A".equals(trgtTableId))
				{
					//checkParam1to50(errFields, inCBSMsg, 1,2,3,4,5,6);
				}
				else
				{
					errFields.add("trgt_table_id");
				}
			}
		}

		if (errFields.size() > 0)
		{
			// エラー情報の設定
			for (String colName : errFields)
			{
				String errField = colName + "_err";
				if (inCBSMsg.containsKeyOfSchema(errField))
				{
					inCBSMsg.set(errField, "E1");
				}
			}
			if (inCBSMsg.containsKeyOfSchema("status"))
			{
				inCBSMsg.set("status", StatusCodes.SINGLEDATA_ERR);
			}

			// エラーログ出力
			String sjishoNo = inCBSMsg.getString("sjisho_no");
			String type = inCBSMsg.getSchemaName().replaceAll(".*\\.", "").substring(7,8);
			String action = ("D".equals(type)) ? "指示書登録" : (("E".equals(type)) ? "指示書削除" : (("C".equals(type) ? "指示書更新" : "AxM連携")));
			String errMsg = "指示書パラメータに誤りがある為、" + action + "をスキップしました。指示書No:" + sjishoNo + "、エラー項目：" + errFields.toString();
			JSYejbLog.println(JSYejbLog.ERROR, JCK0151TPMA.class, errMsg);
		}

		return (errFields.size() == 0);
	}

	/**
	 * パラメータ１〜５０の必須入力チェックを行なう。<br />
	 * ※エラー項目の項目名がエラー項目リストに追加される。
	 * @param errFields エラー項目リスト
	 * @param inCBSMsg CAANMsg
	 * @param paramNoAll パラメータ番号
	 */
	private static void checkParam1to50(List<String> errFields, CAANMsg inCBSMsg, Integer...paramNoAll)
	{
		for (Integer paramNo : paramNoAll)
		{
			String paramName = "parameter_" + paramNo;
			String paramVal  = inCBSMsg.getString(paramName);
			if (JCKLcsCommonUtil.isNullOrBlank(paramVal))
			{
				errFields.add(paramName);
			}
		}
	}
}