/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECNA0050001TPMA
*   ソースファイル名：JECNA0050001TPMA.java
*   作成者          ：富士通
*   日付            ：2011年10月27日
*＜機能概要＞
*   主処理(共通)<BR>
*   チョイスチケット利用取消API呼び出し部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/27  富士通      新規作成
*
**********************************************************************/

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.ECNA0050001CBSMsg;
import eo.ejb.common.JCCModelCommon;

import eo.ejb.common.JCKLcsRenkeiUtil;

/**
 * <p>
 * CCMG連携コンテンツ決済独自処理部品クラスです。
 * </p>
 * @author 富士通
 */

public class JECNA0050001TPMA implements TemplateMainHandler
{
	/** プログラムID*/
	public static final String PGID = "JECNA0050001TPMA";
	
	/** 呼び出し元に返すステータス*/
	private static final String STAT = "STATUS";
	
	/** CCMGから返されたエラーコード*/
	private static final String ERR_CD = "ERR_CD";
	
	/** CCMGにPOSTするコンテンツ契約番号*/
	private static final String CONT_KEI_NO = "CONTRACT_NO";
	
	/** CCMGにPOSTするチョイスチッケト利用番号*/
	private static final String CHOICE_TICKET_USE_NO = "USE_NO";
	
		/** CCMGにPOSTする更新日時*/
	private static final String UPDATE_DATE = "UPDATE_DATE";
	
	/** CCMGから返されるxmlの開始タグ CONTRACT_NO*/
	private static final String TAG_CONTRACT_NO_START = "<CONTRACT_NO>";

	/** CCMGから返されるxmlの終了タグ SYS_ID*/
	private static final String TAG_CONTRACT_NO_END = "</CONTRACT_NO>";
	
	/** CCMGから返されるxmlの開始タグ CONTRACT_NO*/
	private static final String TAG_USE_NO_START = "<USE_NO>";

	/** CCMGから返されるxmlの終了タグ SYS_ID*/
	private static final String TAG_USE_NO_END = "</USE_NO>";
	
	/** CCMGから返されるxmlの開始タグ ERR_CD*/
	private static final String TAG_ERR_CD_START = "<ERR_CD>";
	
	/** CCMGから返されるxmlの終了タグ ERR_CD*/
	private static final String TAG_ERR_CD_END = "</ERR_CD>";

	/** CCMGから返される処理結果(正常終了)*/
	private static final String CCMG_RES_OK = "00000";
	
	/**  httpのレスポンス*/
	private static final String HTTP_RES_OK = "200";

	/** CCMGのURL*/
	private static final String CCMG_API_URL = "CCMG_API_URL";
	
	/** CCMGのコンテンツ解約API*/
	private static final String CCMG_API_CYOI_USE_CAN_ACTION = "CCMG_API_CYOI_USE_CAN_ACTION";
	
	/** CCMGへのリクエストタイムアウト時間*/
	private static final String CCMG_API_TIMEOUT = "CCMG_API_TIMEOUT";
	
	/** CCMGへのリトライ回数*/
	private static final String CCMG_API_RETRY_CNT = "CCMG_API_RETRY_CNT";
	
	/** CCMGへのリトライ間隔*/
	private static final String CCMG_API_RETRY_INTERVAL = "CCMG_API_RETRY_INTERVAL";
	
	/** CCMGへのリクエストメソッド*/
	private static final String POST_METHOD = "POST";
	
	/** CCMGへのリクエストのエンコード*/
	private static final String ENCDING_UTF = "UTF-8";
	
	/** 呼び出し元へ返すステータス(応答なし)*/
	private static final String NO_RES = "2";
	
	
	/**
	 * コンストラクタ.
	 */
	public JECNA0050001TPMA()
	{
		super();
	}

	/**
	 * CCMG連携コンテンツ決済独自処理部品です。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 */
	public void delChoi(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0050001TPMA#delCyoi start");

		// 処理結果の初期化
		Map<String, String> rsltMap = new HashMap<String, String>(8);

		// パラメータをString配列に変換
		String[] params = makeParamCcmgApi(inCBSMsg);

		rsltMap = requestdelChoiApi(inCBSMsg, params);

		// 結果のセット
		inCBSMsg.set(ECNA0050001CBSMsg.STAT, rsltMap.get(STAT));				// ステータス
		inCBSMsg.set(ECNA0050001CBSMsg.CONT_KEI_NO, rsltMap.get(CONT_KEI_NO));	// CONT_KEI_NO
		inCBSMsg.set(ECNA0050001CBSMsg.CHOICE_TICKET_USE_NO_CCMG, rsltMap.get(CHOICE_TICKET_USE_NO));	//CHOICE_TICKET_USE_NO
		inCBSMsg.set(ECNA0050001CBSMsg.ERR_CD, rsltMap.get(ERR_CD));			// エラーコード

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0050001TPMA#delChoi end");
	}


	/**
	 * CCMGのサービスチケット利用取消APIに対してリクエストを送信する。
	 * @param inCBSMsg サービスIFから渡される値
	 * @param params メッセージキャリア
	 * @return CCMGから返された結果コード
	 */
	private Map<String, String> requestdelChoiApi(CAANMsg inCBSMsg, String[] params)
	{
		Map<String, String> result = new HashMap<String, String>(8);
		
		// パラメータ作成
		Map<String, Object> paramPost = new HashMap<String, Object>(6);

		String contKeiNo = params[0];		// コンテンツ契約番号
		String cyoiTikUseNo = params[1];	// チョイスチッケト利用番号
		String updDtm = params[2];		// 更新日時
		
		paramPost.put(CONT_KEI_NO, contKeiNo);
		paramPost.put(CHOICE_TICKET_USE_NO, cyoiTikUseNo);
		paramPost.put(UPDATE_DATE, updDtm);

		// リクエスト送信先をプロパティファイルより取得
		String url = JCCModelCommon.getApplicationConst(CCMG_API_URL);
		String apiName = JCCModelCommon.getApplicationConst(CCMG_API_CYOI_USE_CAN_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 contkeino_ccmg = null;
			String useno_ccmg = null;
			String errorCd = null;
			if (HTTP_RES_OK.equals(httpStatus)) 
			{
				// CCMGから応答があったとき
				
				// コンテンツ契約番号の抽出
				int start = responseXml.indexOf(TAG_CONTRACT_NO_START);
				int end = responseXml.indexOf(TAG_CONTRACT_NO_END);
				if(end == start + TAG_CONTRACT_NO_START.length())
				{
					contkeino_ccmg = "";
				}
				else
				{
					contkeino_ccmg = responseXml.substring(start + TAG_CONTRACT_NO_START.length(), end);
				}
				// チョイスチッケト利用番号の抽出
				start = responseXml.indexOf(TAG_USE_NO_START);
				end = responseXml.indexOf(TAG_USE_NO_END);
				if(end == start + TAG_USE_NO_START.length())
				{
					useno_ccmg = "";
				}
				else
				{
					useno_ccmg = responseXml.substring(start + TAG_USE_NO_START.length(), end);
				}
				// エラーコードの抽出
				start = responseXml.indexOf(TAG_ERR_CD_START);
				end = responseXml.indexOf(TAG_ERR_CD_END);
				if(end == start + TAG_ERR_CD_START.length())
				{
					errorCd = "";
				}
				else
				{
					errorCd = responseXml.substring(start + TAG_ERR_CD_START.length(), end);
				}
				
				// 応答正常かどうかチェック
//				if (CCMG_RES_OK.equals(errorCd))
//				{
//					result.put(STAT, RES_OK);
//				}
//				else
//				{
//					result.put(STAT, RES_NG);
//				}
				result.put(CONT_KEI_NO, contkeino_ccmg);
				result.put(CHOICE_TICKET_USE_NO, useno_ccmg);
				result.put(ERR_CD, errorCd);
			}
			else
			{
				// CCMGから応答がなかったとき
				result.put(STAT, NO_RES);
				result.put(CONT_KEI_NO, "");
				result.put(CHOICE_TICKET_USE_NO, "");
				result.put(ERR_CD, "99999");
			}

		}
		catch (Exception e)
		{
			JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), "");
			// CCMGから応答がなかったとき
			result.put(STAT, NO_RES);
			result.put(CONT_KEI_NO, "");
			result.put(CHOICE_TICKET_USE_NO, "");
			result.put(ERR_CD, "99999");
			return result;
		}
		
		return result;
	}

	/**
	 * CCMGのサービスチケット利用取消APIへ設定するパラメータのデータ型をCAANMsg→String配列に変換します。
	 * @param inCBSMsg
	 * @return パラメータ(String配列)
	 */
	private String[] makeParamCcmgApi(CAANMsg inCBSMsg)
	{
		
		String[] params = new String[]{
			inCBSMsg.getString(ECNA0050001CBSMsg.CONT_KEI_NO),
			inCBSMsg.getString(ECNA0050001CBSMsg.CHOICE_TICKET_USE_NO),
			inCBSMsg.getString(ECNA0050001CBSMsg.UPD_DTM)
		};
		
		return params;
	}

}
