/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECNA0120001TPMA
*   ソースファイル名：JECNA0120001TPMA.java
*   作成者          ：富士通
*   日付            ：2014年07月22日
*＜機能概要＞
*   主処理(共通)<BR>
*   スマートリンク関連コンテンツ全解約API呼び出し部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v10.00		2014/07/22   FJ)味岡	ANK-2139-00-00:新規作成
*
**********************************************************************/

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.ECNA0120001CBSMsg;
import eo.ejb.common.JCCModelCommon;

import eo.ejb.common.JCKLcsRenkeiUtil;

/**
 * <p>
 * CCMG連携コンテンツ決済独自処理部品クラスです。
 * </p>
 * @author 富士通
 */

public class JECNA0120001TPMA implements TemplateMainHandler
{
	/** プログラムID*/
	public static final String PGID = "JECNA0120001TPMA";
	
	/** 呼び出し元に返すステータス*/
	public static final String STAT = "STATUS";
	
	/** CCMGから返されたSYSID*/
	public static final String SYSID_CCMG = "SYSID_CCMG";
	
	/** CCMGから返されたエラーコード*/
	public static final String SYSTEM_ERR_CD = "SYSTEM_ERR_CD";
	
	/** CCMGにPOSTするSYSID*/
	public static final String SYSID = "SYS_ID";
	
	/** CCMGにPOSTするデバイス区分*/
	public static final String DEVICE_DIVISION = "DEVICE_DIVISION";
	
	/** CCMGにPOSTする更新者ID*/
	public static final String UPDATE_ID = "UPDATE_ID";
	
	/** CCMGにPOSTする更新者*/
	public static final String UPDATE_NAME = "UPDATE_NAME";
	
	/** CCMGにPOSTするメール送信フラグ*/
	public static final String MAIL_SEND_FLG = "MAIL_SEND_ID";
	
	/** CCMGから返されるxmlの開始タグ SYS_ID*/
	public static final String TAG_SYS_ID_START = "<SYS_ID>";

	/** CCMGから返されるxmlの終了タグ SYS_ID*/
	public static final String TAG_SYS_ID_END = "</SYS_ID>";
	
	/** CCMGから返されるxmlの開始タグ SYSTEM_ERR_CD*/
	public static final String TAG_ERR_CD_START = "<SYSTEM_ERR_CD>";
	
	/** CCMGから返されるxmlの終了タグ SYSTEM_ERR_CD*/
	public static final String TAG_ERR_CD_END = "</SYSTEM_ERR_CD>";

	/** CCMGから返される処理結果(正常終了)*/
	public static final String CCMG_RES_OK = "00000";
	
	/**  httpのレスポンス*/
	public static final String HTTP_RES_OK = "200";

	/** CCMGのURL*/
	public static final String CCMG_API_URL = "CCMG_API_URL";
	
	/** CCMGのスマートリンク関連コンテンツ全解約API*/
	public static final String CCMG_API_SMLN_CONT_ALLCANCEL_ACTION = "CCMG_API_SMLN_CONT_ALLCANCEL_ACTION";
	
	/** CCMGへのリクエストタイムアウト時間*/
	public static final String CCMG_API_TIMEOUT = "CCMG_API_TIMEOUT";
	
	/** CCMGへのリトライ回数*/
	public static final String CCMG_API_RETRY_CNT = "CCMG_API_RETRY_CNT";
	
	/** CCMGへのリトライ間隔*/
	public static final String CCMG_API_RETRY_INTERVAL = "CCMG_API_RETRY_INTERVAL";
	
	/** PROXYサーバのホスト名*/
	public static final String PROXY_HOST = "PROXY_HOST";
	
	/** PROXYサーバのポート番号*/
	public static final String PROXY_PORT = "PROXY_PORT";
	
	/** CCMGへのリクエストメソッド*/
	public static final String POST_METHOD = "POST";
	
	/** CCMGへのリクエストのエンコード*/
	public static final String ENCDING_UTF = "UTF-8";
	
	/** 呼び出し元へ返すステータス(応答正常)*/
	public static final String RES_OK = "0";
	
	/** 呼び出し元へ返すステータス(応答異常)*/
	public static final String RES_NG = "1";
	
	/** 呼び出し元へ返すステータス(応答なし)*/
	public static final String NO_RES = "2";
	
	
	/**
	 * コンストラクタ.
	 */
	public JECNA0120001TPMA()
	{
		super();
	}

	/**
	 * CCMG連携コンテンツ決済独自処理部品です。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 */
	public void dslCont(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0120001TPMA#SmlnContAllDsl start");

		// 処理結果の初期化
		Map<String, String> rsltMap = new HashMap<String, String>(6);

		// パラメータをString配列に変換
		String[] params = makeParamCcmgApi(inCBSMsg);

		rsltMap = requestSmlnContAllDslApi(inCBSMsg, params);

		// 結果のセット
		inCBSMsg.set(ECNA0120001CBSMsg.STAT, rsltMap.get(STAT));					// ステータス
		inCBSMsg.set(ECNA0120001CBSMsg.SYSID_CCMG, rsltMap.get(SYSID_CCMG));		// SYSID
		inCBSMsg.set(ECNA0120001CBSMsg.SYSTEM_ERR_CD, rsltMap.get(SYSTEM_ERR_CD));	// エラーコード

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0120001TPMA#SmlnContAllDsl end");
	}

	/**
	 * CCMGのスマートリンクコンテンツ全解約APIに対してリクエストを送信する。
	 * @param inCBSMsg サービスIFから渡される値
	 * @param params メッセージキャリア
	 * @return CCMGから返された結果コード
	 */
	private Map<String, String> requestSmlnContAllDslApi(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 deviceDivision = params[1];	// デバイス区分
		String mailSendFlg = params[2];		// メール送信フラグ
		String updId = params[3];			// 更新者ID
		String updNm = params[4];			// 更新者
		
		paramPost.put(SYSID, sysid);
		paramPost.put(DEVICE_DIVISION, deviceDivision);
		paramPost.put(MAIL_SEND_FLG, mailSendFlg);
		paramPost.put(UPDATE_ID, updId);
		paramPost.put(UPDATE_NAME, updNm);

		// リクエスト送信先をプロパティファイルより取得
		String url = JCCModelCommon.getApplicationConst(CCMG_API_URL);
		String apiName = JCCModelCommon.getApplicationConst(CCMG_API_SMLN_CONT_ALLCANCEL_ACTION);
		String proxyHost   = null;
		Integer proxyPort  = null;
		Long timeout       = new Long(JCCModelCommon.getApplicationConst(CCMG_API_TIMEOUT));
		int retryCnt       = Integer.parseInt(JCCModelCommon.getApplicationConst(CCMG_API_RETRY_CNT));
		int retryInterval  = Integer.parseInt(JCCModelCommon.getApplicationConst(CCMG_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 sysid_ccmg = null;
			String errorCd = null;
			if (HTTP_RES_OK.equals(httpStatus)) 
			{
				// CCMGから応答があったとき
				
				// SYSIDの抽出
				int start = responseXml.indexOf(TAG_SYS_ID_START);
				int end = responseXml.indexOf(TAG_SYS_ID_END);
				if(end == start + 8)
				{
					sysid_ccmg = "";
				}
				else
				{
					sysid_ccmg = responseXml.substring(start + 8, end);
				}
				// エラーコードの抽出
				start = responseXml.indexOf(TAG_ERR_CD_START);
				end = responseXml.indexOf(TAG_ERR_CD_END);
				if(end == start + 8)
				{
					errorCd = "";
				}
				else
				{
					errorCd = responseXml.substring(start + 15, end);
				}
				
				// 応答正常かどうかチェック
				if (CCMG_RES_OK.equals(errorCd))
				{
					result.put(STAT, RES_OK);
				}
				else
				{
					result.put(STAT, RES_NG);
				}
				result.put(SYSID_CCMG, sysid_ccmg);
				result.put(SYSTEM_ERR_CD, errorCd);
			}
			else
			{
				// CCMGから応答がなかったとき
				result.put(STAT, NO_RES);
				result.put(SYSID_CCMG, "");
				result.put(SYSTEM_ERR_CD, "");
			}

		}
		catch (Exception e)
		{
			JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), "");
		}
		
		return result;
	}

	/**
	 * APIのINPUTパラメータのデータ型をCAANMsg→String配列に変換します。
	 * @param inCBSMsg
	 * @return パラメータ(String配列)
	 */
	private String[] makeParamCcmgApi(CAANMsg inCBSMsg)
	{
		
		String[] params = new String[]{
			inCBSMsg.getString(ECNA0120001CBSMsg.SYS_ID),
			inCBSMsg.getString(ECNA0120001CBSMsg.DEVICE_DIVISION),
			inCBSMsg.getString(ECNA0120001CBSMsg.MAIL_SEND_FLG),
			inCBSMsg.getString(ECNA0120001CBSMsg.UPDATE_ID),
			inCBSMsg.getString(ECNA0120001CBSMsg.UPDATE_NAME),
		};
		
		return params;
	}

}
