/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0090002TPMA
*	ソースファイル名：JEKKA0090002TPMA.java
*	作成者			：FJ）大島
*	日付			：2020年10月26日
*＜機能概要＞
*	Netflix契約依頼(Token)独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v51.00.00	2020/10/26	FJ）大島	【ANK-3949-00-00】Netflix導入対応（STEP1）
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
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.common.constant.JFUStrConst;
import eo.common.util.JKKCtrlNetflix;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKKA0090002CBSMsg;
import eo.ejb.common.JCCModelCommon;


/**
 * Netflix契約依頼(Enroll)独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JEKKA0090002TPMA implements TemplateMainHandler
{	
	/** API種別(Enroll) **/
	private static final String API_SBT_ENROLL  = "TOKEN";
	/** 返却値 トークン */
	private static final String TOKEN  = "Token";
	/** 返却値 トークン有効期限 */
	private static final String TOKENEXPIRYDATE  = "TokenExpiryDate";
	/** 返却値 エラー */
	private static final String ERROR  = "Error";
	/** 返却値 エラーコード */
	private static final String ERRORCODE  = "ErrorCode";
	/** 返却値 HTTPステータスコード */
	private static final String HTTPSTATUSCODE  = "HttpStatusCode";
	/** 返却値 エラー説明 */
	private static final String ERRORDESCRIPTION  = "ErrorDescription";
	
	/**
	 * Netflix契約依頼(Token)API実行依頼を行います。
	 * 
	 * @param inCBSMsg Netflix契約依頼(Enroll)メッセージ
	 * @param inContext AgentDispatchContext
	 * @throws Exception 
	 */
	public static void ctrlNetflixTokenApi(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{

		Map<String, Object> serviceMap = new LinkedHashMap<String, Object>();
		Map<String, Object> requestMap = new HashMap<String, Object>();
		
		// 連携年月日時分秒
		String opeDateTime = JCCModelCommon.getSysDateTime();
		String ptnracnt_id = JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090002CBSMsg.PTNRACNT_ID));

		// API種別
		serviceMap.put("apiSbtCd", API_SBT_ENROLL);
		// パートナーアカウントID
		serviceMap.put("pai", ptnracnt_id);
		// システム年月日時分秒
		serviceMap.put("opeDateTime", opeDateTime);
		
		// リクエストボディー部
		// タイプ
		requestMap.put("Type", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090002CBSMsg.TYPE)));
		// チャンネル
		requestMap.put("Channel", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090002CBSMsg.CHANNEL)));
		// トークンエラーＵＲＬ
		requestMap.put("TokenErrorURL", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090002CBSMsg.TOKENERRORURL)));
//		// サービスプロバイダ
//		requestMap.put("ServiceProvider", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090002CBSMsg.SERVICEPROVIDER)));
		// 居住国
		requestMap.put("PartnerChargeCountry", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090002CBSMsg.PARTNERCHARGECOUNTRY)));
		
		serviceMap.put("requestValue", requestMap);

		// 連携開始ログ出力
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090001TPMA.class , "KKIFE447 Start#PTNRACNT_ID=" + ptnracnt_id);

		// コマンド発行部品のインスタンスを取得
		JKKCtrlNetflix instance = JKKCtrlNetflix.getInstance();
		Map<String, Object> resultinfo = instance.call_netflix(serviceMap);
		// 戻り値の取得
		String reqHeader = (String)resultinfo.get("reqHeader");
		String request = (String)resultinfo.get("request");
		String response = (String)resultinfo.get("response");
		String url = JFUStrConst.EMPTY;
		if (resultinfo.containsKey("url"))
		{
			url = (String)resultinfo.get("url");
		}

		// ログ出力
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090001TPMA.class , "JEKKA0090002TPMA#Header=" + reqHeader);
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090002TPMA.class , "JEKKA0090002TPMA#request=" + request);
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090002TPMA.class , "JEKKA0090002TPMA#response=" + response);
		if (!JFUStrConst.EMPTY.equals(url))
		{
			JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090002TPMA.class , "JEKKA0090002TPMA#url=" + url);
		}
		
		// 戻り値の設定
		String token = null;
		String tokenExpiryDate = null;
		String errorCode = null;
		int httpStatusCode = 500;
		String errorDescription = null;
		if ( response.length() > 0 )
		{
			ObjectMapper mapper = new ObjectMapper();
			try
			{
				JsonNode root = mapper.readTree(response.toString());
				// トークン
				if (root.findValue(TOKEN) != null)
				{
					token = root.get(TOKEN).textValue();
				}
				// トークン有効期限
				if (root.findValue(TOKENEXPIRYDATE) != null)
				{
					tokenExpiryDate = parseFromISO8601(root.get(TOKENEXPIRYDATE).textValue());
				}
				// 【処理結果】を取得
				if (root.findValue(ERROR) != null)
				{
					JsonNode error = mapper.readTree(root.get(ERROR).toString());
					// エラーコード
					if (error.findValue(ERRORCODE) != null)
					{
						errorCode = error.get(ERRORCODE).textValue();
					}
					// HTTPステータスコード
					if (error.findValue(HTTPSTATUSCODE) != null)
					{
						httpStatusCode = error.get(HTTPSTATUSCODE).intValue();
					}
					// エラー説明
					if (error.findValue(ERRORDESCRIPTION) != null)
					{
						errorDescription = error.get(ERRORDESCRIPTION).textValue();
					}
				} else {
					// エラーコード
					if (root.findValue(ERRORCODE) != null)
					{
						errorCode = root.get(ERRORCODE).textValue();
					}
					// HTTPステータスコード
					if (root.findValue(HTTPSTATUSCODE) != null)
					{
						httpStatusCode = root.get(HTTPSTATUSCODE).intValue();
					}
					// エラー説明
					if (root.findValue(ERRORDESCRIPTION) != null)
					{
						errorDescription = root.get(ERRORDESCRIPTION).textValue();
					}
				}
			}
			catch (Exception ex)
			{
				ex.printStackTrace();
			}
		}
		// 正常終了の場合のみ返却値を返す
		if (httpStatusCode >= 200 && httpStatusCode < 300)
		{
			// トークン
			inCBSMsg.set(EKKA0090002CBSMsg.TOKEN, token);
			// トークン有効期限
			inCBSMsg.set(EKKA0090002CBSMsg.TOKENEXPIRYDATE, tokenExpiryDate);
		}
		// エラーコード
		inCBSMsg.set(EKKA0090002CBSMsg.ERRORCODE, errorCode);
		// HTTPステータスコード
		inCBSMsg.set(EKKA0090002CBSMsg.HTTPSTATUSCODE, String.valueOf(httpStatusCode));
		// エラー説明
		inCBSMsg.set(EKKA0090002CBSMsg.ERRORDESCRIPTION, errorDescription);
	}
	/**
	 * ISO8601(yyyyMMdd'T'HHmmssZ)形式から、yyyyMMddHHmmss形式へ変換する。
	 * @param isoFormatDate ISO8601(yyyyMMdd'T'HHmmssZ)形式
	 * @throws ParseException 
	 */
	private static String parseFromISO8601(String isoFormatDate) throws ParseException
	{
		SimpleDateFormat isoFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmssZ");
		Date opeDate = isoFormat.parse(isoFormatDate);
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    	return dateFormat.format(opeDate);
	}
}
