/*********************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECNA0010001TPMA
*   ソースファイル名：JECNA0010001TPMA.java
*   作成者          ：富士通
*   日付            ：2011年10月14日
*＜機能概要＞
*   主処理(共通)<BR>
*   コンテンツ解約API呼び出し部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/14  富士通      新規作成
*   v3.00.00	2012/08/31  FJ)小林    【ST1-2012-0000480】外部IFパラメータ設定順を修正
*   v10.00.00	2014/09/11  FJ)味岡    【ANK-2139-02-00  】スマートリンク関連コンテンツ全解約時に、コンテンツ解約APIを呼出する変更対応
*   v10.00.01	2014/09/20  FJ)味岡    【OM-2014-0003097/ANK-2139-02-00】パラメータ名:メール送信有無→メール送信フラグへの変更(9/19:UIレビュー時指摘分の対応)
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
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.ECNA0010001CBSMsg;
import eo.ejb.common.JCCModelCommon;

import eo.ejb.common.JCKLcsRenkeiUtil;

/**
 * <p>
 * CCMG連携コンテンツ決済独自処理部品クラスです。
 * </p>
 * @author 富士通
 */

public class JECNA0010001TPMA implements TemplateMainHandler
{
	/** プログラムID*/
	public static final String PGID = "JECNA0010001TPMA";
	
	/** 呼び出し元に返すステータス*/
	public static final String STAT = "STATUS";
	
	/** CCMGから返されたSYSID*/
	public static final String SYSID_CCMG = "SYSID_CCMG";
	
	/** CCMGから返されたエラーコード*/
	public static final String ERR_CD = "ERR_CD";
	
	/** CCMGにPOSTするSYSID*/
	public static final String SYSID = "SYS_ID";
	
	/** CCMGにPOSTするコンテンツ契約番号*/
	public static final String CONTRACT_NO = "CONTRACT_NO";
	
	/** 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 UPDATE_DATE = "UPDATE_DATE";
	
	// OM-2014-0003097/ANK-2139-02-00 MOD START
	/** CCMGにPOSTするメール送信フラグ*/
//	public static final String MAIL_SEND_FLG = "MAIL_SEND_ID";
	public static final String MAIL_SEND_FLG = "MAIL_SEND_FLG";
	// OM-2014-0003097/ANK-2139-02-00 MOD END
	
	/** CCMGにPOSTするメール送信フラグ*/
	public static final String CANCEL_CHAIN_FLG = "CANCEL_CHAIN_FLG";
	
	/** 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の開始タグ ERR_CD*/
	public static final String TAG_ERR_CD_START = "<ERR_CD>";
	
	/** CCMGから返されるxmlの終了タグ ERR_CD*/
	public static final String TAG_ERR_CD_END = "</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_CANCEL_CONT_ACTION = "CCMG_API_CANCEL_CONT_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 JECNA0010001TPMA()
	{
		super();
	}

	/**
	 * CCMG連携コンテンツ決済独自処理部品です。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 */
	public void dslCont(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0010001TPMA#dslCont start");

		// 処理結果の初期化
		Map<String, String> rsltMap = new HashMap<String, String>(6);

		// パラメータをString配列に変換
		String[] params = makeParamCcmgApi(inCBSMsg);

		rsltMap = requestDslContApi(inCBSMsg, params);

		// 結果のセット
		inCBSMsg.set(ECNA0010001CBSMsg.STAT, rsltMap.get(STAT));				// ステータス
		inCBSMsg.set(ECNA0010001CBSMsg.SYSID_CCMG, rsltMap.get(SYSID_CCMG));	// SYSID
		inCBSMsg.set(ECNA0010001CBSMsg.ERR_CD, rsltMap.get(ERR_CD));			// エラーコード

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JECNA0010001TPMA#dslCont end");
	}

	/**
	 * CCMGのコンテンツ解約APIに対してリクエストを送信する。
	 * @param inCBSMsg サービスIFから渡される値
	 * @param params メッセージキャリア
	 * @return CCMGから返された結果コード
	 */
	private Map<String, String> requestDslContApi(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 contKeiNo = params[1];		// コンテンツ契約番号
		String mailSendFlg = params[2];		// メール送信フラグ
		
		// ANK-2139-02-00 MOD START
		String cancelChainFlg = "0";
		if(params[3] == null)
		{
			cancelChainFlg = "0";
		}
		else
		{
			cancelChainFlg = params[3];	// 共連れ解約フラグ
		}
		String updId = params[4];			// 更新者ID
		String updNm = params[5];			// 更新者
		String updDtm = params[6];			// 更新日時
		// ANK-2139-02-00 MOD END
		
		paramPost.put(SYSID, sysid);
		paramPost.put(CONTRACT_NO, contKeiNo);
		paramPost.put(UPDATE_ID, updId);
		paramPost.put(UPDATE_NAME, updNm);
		paramPost.put(UPDATE_DATE, updDtm);
		paramPost.put(MAIL_SEND_FLG, mailSendFlg);
		paramPost.put(CANCEL_CHAIN_FLG, cancelChainFlg);

		// リクエスト送信先をプロパティファイルより取得
		String url = JCCModelCommon.getApplicationConst(CCMG_API_URL);
		String apiName = JCCModelCommon.getApplicationConst(CCMG_API_CANCEL_CONT_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);

			// ANK-2139-02-00 ADD START
			JSYwebLog.println(JSYLogBase.EXECUTION, this.getClass(), null, "BPCON0I002",  new String[]{"CNIFE009_コンテンツ解約依頼リクエスト情報:= " + url + apiName + paramPost}, "");
			// ANK-2139-02-00 ADD END

			// 処理結果の取得
			String httpStatus   = response[0];
			String responseXml = response[1];
			String sysid_ccmg = null;
			String errorCd = null;
			if (HTTP_RES_OK.equals(httpStatus)) 
			{
				// CCMGから応答があったとき
				
				// SYSIDの抽出
				
				// ANK-2139-02-00 ADD START
				JSYwebLog.println(JSYLogBase.EXECUTION, this.getClass(), null, "BPCON0I002",  new String[]{"CNIFE009_コンテンツ解約依頼レスポンス情報:= " + responseXml}, "");
				// ANK-2139-02-00 ADD END
				
				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 + 8, 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(ERR_CD, errorCd);
			}
			else
			{
				// CCMGから応答がなかったとき
				result.put(STAT, NO_RES);
				result.put(SYSID_CCMG, "");
				result.put(ERR_CD, "");
			}

		}
		catch (Exception e)
		{
			JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), "");
		}
		
		return result;
	}

	/**
	 * AxM連携用ユーティリティに渡すパラメータ(1〜50)のデータ型をCAANMsg→String配列に変換します。
	 * @param inCBSMsg
	 * @return パラメータ(String配列)
	 */
	private String[] makeParamCcmgApi(CAANMsg inCBSMsg)
	{
		
		String[] params = new String[]{
			inCBSMsg.getString(ECNA0010001CBSMsg.SYSID),
			inCBSMsg.getString(ECNA0010001CBSMsg.CONTRACT_NO),
			inCBSMsg.getString(ECNA0010001CBSMsg.MAIL_SEND_FLG),
			inCBSMsg.getString(ECNA0010001CBSMsg.CANCEL_CHAIN_FLG),
			inCBSMsg.getString(ECNA0010001CBSMsg.UPD_USER_ID),
			inCBSMsg.getString(ECNA0010001CBSMsg.UPD_USER),
			inCBSMsg.getString(ECNA0010001CBSMsg.UPD_DATE)
		};
		
		return params;
	}

}
