/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECNA0030001TPMA
*   ソースファイル名：JECNA0030001TPMA.java
*   作成者          ：富士通
*   日付            ：2011年10月14日
*＜機能概要＞
*   主処理(共通)<BR>
*   与信判定API呼び出し部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2012/02/08  富士通      新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.ejb.cbs.cbsmsg.ECNA0030001CBSMsg;
import eo.ejb.common.JCCModelCommon;

import eo.ejb.common.JCKLcsRenkeiUtil;

/**
 * <p>
 * AxM与信判定API呼出用独自処理部品クラスです。
 * </p>
 * @author 富士通
 */

public class JECNA0030001TPMA implements TemplateMainHandler
{
	/** プログラムID*/
	public static final String PGID = "JECNA0030001TPMA";
	
	/** SYSID */
	private static final String SYSID = "sysid";
	/** 支払方法 */
	private static final String PAYWAY = "shriHuhu";
	/** 支払方法ID */
	private static final String PAYWAY_ID = "shriHuhuId";
	/** カード会社コード */
	private static final String CRECARD_COMP_CD = "kdKishaCd";
	/** カード番号 */
	private static final String CRECARD_NO = "kdBngu";
	/** 有効期限 */
	private static final String CRECARD_YK_KIGEN = "yukuKgn";
	/** カード名義人 */
	private static final String CUST_NM_ROMAJI = "kdMignn";
	/** 購入金額 */
	private static final String BUY_AMNT = "kouKin";
	
	/** 戻りコード */
	private static final String RETURNCODE = "returnCode";
	/** 与信結果 */
	private static final String AUTHORITYRESULT = "authorityResult";
	/** 支払方法ID */
	private static final String PAYMENTMETHODID = "paymentMethodId";

	/** AxMから返される戻り値のxmlタグ RETURN_CODE*/
	private static final String TAG_RETURN_CODE_START = "<RETURN_CODE>";
	private static final String TAG_RETURN_CODE_END = "</RETURN_CODE>";
	
	/** AxMから返される与信判定結果のxmlタグ AUTHORITY_RESULT*/
	private static final String TAG_AUTHORITY_RESULT_START = "<AUTHORITY_RESULT>";
	private static final String TAG_AUTHORITY_RESULT_END = "</AUTHORITY_RESULT>";
	
	/** AxMから返される支払方法IDのxmlタグ */
	private static final String TAG_PAYMENT_START = "<PAYMENT_METHOD_ID>";
	private static final String TAG_PAYMENT_END = "</PAYMENT_METHOD_ID>";

	/** AxMから返される処理結果(正常終了)*/
	private static final String AXM_RES_OK = "00";
	
	/**  httpのレスポンス*/
	private static final String HTTP_RES_OK = "200";

	/** AxMのURL(プロパティファイルキー値)*/
	private static final String AXM_API_CHAGE_JUDGE_URL = "AXM_API_CHAGE_JUDGE_URL";
	
	/** AxM与信判定API名(プロパティファイルキー値)*/
	private static final String AXM_API_CHARGE_JUDGE = "AXM_API_CHARGE_JUDGE";
	
	/** AxMへのリクエストタイムアウト時間*/
	private static final String AXM_API_TIMEOUT = "AXM_API_TIMEOUT";
	
	/** AxMへのリトライ回数*/
	private static final String AXM_API_RETRY_CNT = "AXM_API_RETRY_CNT";
	
	/** AxMへのリトライ間隔*/
	private static final String AXM_API_RETRY_INTERVAL = "AXM_API_RETRY_INTERVAL";
	
	/** PROXYサーバのホスト名*/
	private static final String PROXY_HOST = "PROXY_HOST";
	
	/** PROXYサーバのポート番号*/
	private static final String PROXY_PORT = "PROXY_PORT";
	
	/** AxMへのリクエストメソッド*/
	private static final String POST_METHOD = "POST";
	
	/** AxMへのリクエストのエンコード*/
	private static final String ENCDING_UTF = "UTF-8";
	
	/** 呼び出し元へ返すステータス(応答正常)*/
	private static final String RES_OK = "00";
	
	/** 呼び出し元へ返すステータス(応答異常)*/
	private static final String RES_NG = "1";
	
	/** 呼び出し元へ返すステータス(応答なし)*/
	private static final String NO_RES = "2";
	
	
	/**
	 * コンストラクタ.
	 */
	public JECNA0030001TPMA()
	{
		super();
	}

	/**
	 * AxM与信判定API呼出用独自処理部品です。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 */
	public void creditJudge(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0030001TPMA#dslCont start");

		// 処理結果の初期化
		Map<String, String> rsltMap = new HashMap<String, String>();

		// パラメータをString配列に変換
		String[] params = makeParamCcmgApi(inCBSMsg);

		rsltMap = requestCreditJudgeApi(inCBSMsg, params);

		// 結果のセット
		inCBSMsg.set(ECNA0030001CBSMsg.RETURNCODE, rsltMap.get(RETURNCODE));			// 戻りコード
		inCBSMsg.set(ECNA0030001CBSMsg.AUTHORITYRESULT, rsltMap.get(AUTHORITYRESULT));	// 与信結果
		inCBSMsg.set(ECNA0030001CBSMsg.PAYMENTMETHODID, rsltMap.get(PAYMENTMETHODID));	// 支払方法ID

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0030001TPMA#dslCont end");
	}

	/**
	 * AxM与信判定APIに対してリクエストを送信する。
	 * @param inCBSMsg サービスIFから渡される値
	 * @param params メッセージキャリア
	 * @return AxMから返された結果コード
	 */
	private Map<String, String> requestCreditJudgeApi(CAANMsg inCBSMsg, String[] params)
	{
		Map<String, String> result = new HashMap<String, String>(6);
		
		// パラメータ作成
		Map<String, Object> paramPost = new HashMap<String, Object>(10);

		String sysid = params[0];			// SYSID
		String payway = params[1];			// 支払方法
		String paywayId = params[2];		// 支払方法ID
		String crecardCompCd = params[3];	// カード会社コード
		String crecardNo = params[4];		// カード番号
		String crecardYkKigen = params[5];	// 有効期限
		String custNmRomaji = params[6];	// カード名義人
		String buyAmnt = params[7];			// 購入金額
		
		paramPost.put(SYSID, sysid);
		paramPost.put(PAYWAY, payway);
		paramPost.put(PAYWAY_ID, paywayId);
		paramPost.put(CRECARD_COMP_CD, crecardCompCd);
		paramPost.put(CRECARD_NO, crecardNo);
		paramPost.put(CRECARD_YK_KIGEN, crecardYkKigen);
		paramPost.put(CUST_NM_ROMAJI, custNmRomaji);
		paramPost.put(BUY_AMNT, buyAmnt);

		// リクエスト送信先をプロパティファイルより取得
		String url = JCCModelCommon.getApplicationConst(AXM_API_CHAGE_JUDGE_URL);
		String apiName = JCCModelCommon.getApplicationConst(AXM_API_CHARGE_JUDGE);
		String proxyHost   = null;
		Integer proxyPort  = null;
		Long timeout       = new Long(JCCModelCommon.getApplicationConst(AXM_API_TIMEOUT));
		int retryCnt       = Integer.parseInt(JCCModelCommon.getApplicationConst(AXM_API_RETRY_CNT));
		int retryInterval  = Integer.parseInt(JCCModelCommon.getApplicationConst(AXM_API_RETRY_INTERVAL));
		
		String methodType  = POST_METHOD;	// メソッドの設定(POST)
		String encoding    = ENCDING_UTF;	// 文字コードの設定(UTF-8)

		try
		{
			// リクエスト送信
			String[] response = JCKLcsRenkeiUtil.sendHttpRequest(url + apiName, proxyHost, 
					proxyPort, timeout, retryCnt, retryInterval, methodType, encoding, paramPost);

			// 処理結果の取得
			String httpStatus   = response[0];
			String responseXml = response[1];
			String return_code = null;
			String result_code = null;
			String paymen_id = null;

			if (HTTP_RES_OK.equals(httpStatus)) 
			{
				// AxMから応答があったとき
				
				// 戻り値の抽出
				int start = responseXml.indexOf(TAG_RETURN_CODE_START);
				int end = responseXml.indexOf(TAG_RETURN_CODE_END);
				if(end == start + TAG_RETURN_CODE_START.length())
				{
					return_code = "";
				}
				else
				{
					return_code = responseXml.substring(start + TAG_RETURN_CODE_START.length(), end);
				}
				// 与信判定結果の抽出
				start = responseXml.indexOf(TAG_AUTHORITY_RESULT_START);
				end = responseXml.indexOf(TAG_AUTHORITY_RESULT_END);
				if(end == start + TAG_AUTHORITY_RESULT_START.length())
				{
					result_code = "";
				}
				else
				{
					result_code = responseXml.substring(start + TAG_AUTHORITY_RESULT_START.length(), end);
				}
				// 支払方法IDの抽出
				start = responseXml.indexOf(TAG_PAYMENT_START);
				end = responseXml.indexOf(TAG_PAYMENT_END);
				if(end == start + TAG_PAYMENT_START.length())
				{
					paymen_id = "";
				}
				else
				{
					paymen_id = responseXml.substring(start + TAG_PAYMENT_START.length(), end);
				}
				
				result.put(RETURNCODE, return_code);
				result.put(AUTHORITYRESULT, result_code);
				result.put(PAYMENTMETHODID, paymen_id);
			}
			else
			{
				// AxMから応答がなかったとき
				result.put(RETURNCODE, NO_RES);
				result.put(AUTHORITYRESULT, "");
				result.put(PAYMENTMETHODID, "");
			}

		}
		catch (Exception e)
		{
			JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), "");
			result.put(RETURNCODE, RES_NG);
			result.put(AUTHORITYRESULT, "");
			result.put(PAYMENTMETHODID, "");
			
			return result;
		}
		
		return result;
	}

	/**
	 * AxM与信判定APIへのパラメータを編集します。
	 * @param inCBSMsg
	 * @return パラメータ(String配列)
	 */
	private String[] makeParamCcmgApi(CAANMsg inCBSMsg)
	{
		
		String[] params = new String[]{
			inCBSMsg.getString(ECNA0030001CBSMsg.SYSID),
			inCBSMsg.getString(ECNA0030001CBSMsg.SHRIHUHU),
			inCBSMsg.getString(ECNA0030001CBSMsg.SHRIHUHUID),
			inCBSMsg.getString(ECNA0030001CBSMsg.KDKISHACD),
			inCBSMsg.getString(ECNA0030001CBSMsg.KDBNGU),
			inCBSMsg.getString(ECNA0030001CBSMsg.YUKUKGN),
			inCBSMsg.getString(ECNA0030001CBSMsg.KDMIGNN),
			inCBSMsg.getString(ECNA0030001CBSMsg.KOUKIN)
		};
		
		return params;
	}

}
