/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0090001TPMA
*	ソースファイル名：JEKKA0090001TPMA.java
*	作成者			：FJ）大島
*	日付			：2020年10月26日
*＜機能概要＞
*	Netflix契約依頼(Enroll)独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v51.00.00	2020/10/26	FJ）大島	【ANK-3949-00-00】Netflix導入対応（STEP1）
*	v51.01.00	2020/12/21	FJ)舘山		【ANK-3949-08-00】自動Enroll対応
*	v52.00.00	2021/10/26	FJ）澤田	【ANK-3987-00-00】Netflix導入対応(STEP2)
*	v52.00.00	2021/02/02	FJ）澤田	【ANK-3987-13-00】Netflix導入対応(STEP2)
*	v52.00.01	2021/01/29	FJ）吉田	【ANK-3987-12-00】Netflix導入対応(STEP2)
*	v52.00.02	2021/01/29	FJ）三原	【ANK-3987-00-00】Netflix導入対応(STEP2)
********************************************************************************/
package eo.ejb.cbs.mainproc;

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.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
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.JKKCommonUtil;
import eo.common.util.JKKCtrlNetflix;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbs.cbsmsg.EKKA0090001CBSMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.db.JKKejbExclusiveProcCommon;
import eo.ejb.common.db.JKKejbExclusiveProcKK2111;
import eo.ejb.common.db.JKKejbKK0091SecProc;
import eo.ejb.common.edit.JKKejbKKA009NumberParts;


/**
 * Netflix契約依頼(Enroll)独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JEKKA0090001TPMA implements TemplateMainHandler
{	
	/** API種別(Enroll) **/
	private static final String API_SBT_ENROLL  = "ENROLL";
	/** 返却値 エラー */
	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";
// ▽▽▽ ANK-3949-08-00 ADD START
	/** エラーフラグ */
	private static final String ERR_FLG = "EA";
// △△△ ANK-3949-08-00 ADD END
	// ANK-3987-00-00 ADD START
	/** イベントタイプ New:新規 */
	private static final String EVENTTYPE_NEW = "New";
	// ANK-3987-00-00 ADD END
	
	/**
	 * Netflix契約依頼(Enroll)API実行依頼を行います。
	 * 
	 * @param inCBSMsg Netflix契約依頼(Enroll)メッセージ
	 * @param inContext AgentDispatchContext
	 * @throws Exception 
	 */
	public static void ctrlNetflixEnrollApi(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{

		Map<String, Object> serviceMap = new LinkedHashMap<String, Object>();
		Map<String, Object> requestMap = new HashMap<String, Object>();
		
// ▽▽▽ ANK-3949-08-00 ADD START
		// 排他制御
		if (!inCBSMsg.isNull(EKKA0090001CBSMsg.KEY_SVC_KEI_NO) && !inCBSMsg.isNull(EKKA0090001CBSMsg.UPD_DTM_BF))
		{
			// 必要な項目を保持したETMsgを作成する
			CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());

			// プライマリキーを設定
			inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKKA0090001CBSMsg.KEY_SVC_KEI_NO));

			// 更新情報の設定
			inETMsg.set(KK0081ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			inETMsg.set(KK0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			String funcCd = inCBSMsg.getString(EKKA0090001CBSMsg.FUNC_CODE);
			String updDtmBf = inCBSMsg.getString(EKKA0090001CBSMsg.UPD_DTM_BF);
			if (!new JKKejbExclusiveProcKK2111().isExProcSvcKeiNo(inETMsg, inCBSMsg.getString(EKKA0090001CBSMsg.KEY_SVC_KEI_NO), updDtmBf, funcCd))
			{
				inCBSMsg.set(EKKA0090001CBSMsg.UPD_DTM_BF_ERR, ERR_FLG);
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
				return ;
			}
		}
// △△△ ANK-3949-08-00 ADD END

		// 連携年月日時分秒
		String opeDateTime = JCCModelCommon.getSysDateTime();
		// ＫＥＹ_サービス契約番号
		String svc_kei_no = JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.KEY_SVC_KEI_NO));

		JKKejbKKA009NumberParts kka009num = new JKKejbKKA009NumberParts();

		// API種別
		serviceMap.put("apiSbtCd", API_SBT_ENROLL);
		// パートナーアカウントID
		// ANK-3987-00-00 MOD START
		//String ptnracntId = JKKStringUtil.nullToBlank(kka009num.getPtnracntId(inCBSMsg, inContext));
		//serviceMap.put("pai", ptnracntId);
		String ptnracntId;
		// パートナーアカウントIDがNULLの場合、採番する
		if (JKKStringUtil.isNullBlank(inCBSMsg.getString(EKKA0090001CBSMsg.PTNRACNT_ID)))
		{
			ptnracntId = JKKStringUtil.nullToBlank(kka009num.getPtnracntId(inCBSMsg, inContext));
			serviceMap.put("pai", ptnracntId);
		}
		// パートナーアカウントIDがNULL以外の場合、採番しない
		else
		{
			ptnracntId = JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.PTNRACNT_ID));
			serviceMap.put("pai", ptnracntId);
		}
		// ANK-3987-00-00 MOD END
		// 運用年月日時分秒
		serviceMap.put("opeDateTime", opeDateTime);
		
		// リクエストボディー部
		// バンドルID
		requestMap.put("BundleID", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.BUNDLE_ID)));
		// イベントタイプ
		requestMap.put("EventType", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.EVENTTYPE)));
		// Netflix登録メール
		String netflixEmail =  JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXEMAIL));
		if (!JFUStrConst.EMPTY.equals(netflixEmail))
		{
			requestMap.put("NetflixEmail", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXEMAIL)));
		}
//		// Netflix登録電話番号
//		requestMap.put("NetflixPhone", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXPHONE)));
		// ANK-3987-00-00 ADD START
		String netflixPhone =  JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXPHONE));
		// v52.00.02 ANK-3987-00-00 ADD START
		// 国際電話番号に変換する
		netflixPhone = JKKCommonUtil.changeInternationalTelno(netflixPhone);
		// v52.00.02 ANK-3987-00-00 ADD END
		if (!JFUStrConst.EMPTY.equals(netflixPhone))
		{
			// v52.00.02 ANK-3987-00-00 MOD START
			//requestMap.put("NetflixPhone", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXPHONE)));
			requestMap.put("NetflixPhone", JKKStringUtil.nullToBlank(netflixPhone));
			// v52.00.02 ANK-3987-00-00 MOD END
		}
		// ANK-3987-00-00 ADD END
		// 優先言語
		requestMap.put("PreferredLanguage", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.PREFERREDLANGUAGE)));
//		// 請求終了日
//		requestMap.put("BillingEndDate", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.BILLINGENDDATE)));
		// 請求イベントID
		String billingEventId = JKKStringUtil.nullToBlank(kka009num.getBillingEventId(inCBSMsg, inContext, opeDateTime));
		requestMap.put("BillingEventID", billingEventId);
		// Netflix提供ID
		requestMap.put("NetflixOfferID", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXOFFER_ID)));
//		// サービスプロバイダ
//		requestMap.put("ServiceProvider", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.SERVICEPROVIDER)));
		// 請求開始日
		String billingStartDate = JCCModelCommon.getSysDate();
		requestMap.put("BillingStartDate", billingStartDate);
		// ANK-3987-00-00 DEL START
		// Netflixベース提供ID
		//requestMap.put("NetflixBaseOfferID", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.NETFLIXBASEOFFER_ID)));
		// ANK-3987-00-00 DEL END
		// 居住国
		requestMap.put("PartnerChargeCountry", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.PARTNERCHARGECOUNTRY)));
		
		serviceMap.put("requestValue", requestMap);

		// 連携開始ログ出力
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090001TPMA.class , "KKIFE446 Start#SVC_KEI_NO=" + svc_kei_no);

		// コマンド発行部品のインスタンスを取得
		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 , "JEKKA0090001TPMA#Header=" + reqHeader);
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090001TPMA.class , "JEKKA0090001TPMA#request=" + request);
		JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090001TPMA.class , "JEKKA0090001TPMA#response=" + response);
		if (!JFUStrConst.EMPTY.equals(url))
		{
			JSYejbLog.println(JSYejbLog.EXECUTION, JEKKA0090001TPMA.class , "JEKKA0090001TPMA#url=" + url);
		}
		
		// 戻り値の設定
		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(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();
			}
		}
		// 正常終了の場合のみパートナーアカウントIDの更新
		if (httpStatusCode >= 200 && httpStatusCode < 300)
		{
			// パートナーアカウントID
			inCBSMsg.set(EKKA0090001CBSMsg.PTNRACNT_ID, ptnracntId);
			// 請求イベントID
			inCBSMsg.set(EKKA0090001CBSMsg.BILLINGEVENT_ID, billingEventId);
			// 請求開始日
			inCBSMsg.set(EKKA0090001CBSMsg.BILLINGSTARTDATE, billingStartDate);
			// ANK-3987-00-00 MOD START
//			// パートナーアカウントID更新処理の呼び出し
//			new JKKejbKK0091SecProc().setPtnracntID(svc_kei_no, ptnracntId, inCBSMsg.getString(EKKA0090001CBSMsg.OPERATEDATETIME), "KKIFE445");
			// パートナーIDが新規の場合のみ更新処理を行う
			if (EVENTTYPE_NEW.equals(JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0090001CBSMsg.EVENTTYPE))))
			{
				// パートナーアカウントID更新処理の呼び出し
				new JKKejbKK0091SecProc().setPtnracntID(svc_kei_no, ptnracntId, inCBSMsg.getString(EKKA0090001CBSMsg.OPERATEDATETIME), "KKIFE445");
			}
			// ANK-3987-00-00 MOD END
		}
		// 承認時間
		inCBSMsg.set(EKKA0090001CBSMsg.AUTHORIZATIONTIME, opeDateTime);
		// エラーコード
		inCBSMsg.set(EKKA0090001CBSMsg.ERRORCODE, errorCode);
		// HTTPステータスコード
		inCBSMsg.set(EKKA0090001CBSMsg.HTTPSTATUSCODE, String.valueOf(httpStatusCode));
		// エラー説明
		inCBSMsg.set(EKKA0090001CBSMsg.ERRORDESCRIPTION, errorDescription);
	}
}
