/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKAdchgSmtvlCC
*	ソースファイル名：JKKAdchgSmtvlCC.java
*	作成者			：富士通
*	日付			：2014年02月25日
*＜機能概要＞
*	住所変更スマートバリューCCです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v8.00.00	2014/02/25	T.TORIKAI	新規作成：ANK-1844-00-00
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKSmtvlIdoInfAddConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK2441B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2451B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2451B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2451C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2451D010CBSMsg;

public class JKKAdchgSmtvlCC extends AbstractCommonComponent {

	/** スマートバリュー異動情報登録処理呼出用ユーザー任意文字列 */
	private final String FIXED_TEXT_ADD_SMTVL_IDO_INFO = "JKK_ADCHG_SMTVL_CC_ADD_SMTVL_IDO_INFO";

	/** セッションハンドル */
	private SessionHandle sessionHandle = null;

	/** リクエストパラメータ */
	private IRequestParameterReadWrite requestParameter = null;

	/** ユーザ任意文字列 */
	private String fixedText = null;

	/** 住所変更登録コモンコンポーネントマッピングクラスインスタンス */
	private JKKAdchgMapperCC mapper = null;

	/** SCリクエストInvoker */
	private ServiceComponentRequestInvoker scCall = null;

	/**
	 * スマートバリュー紐付け変更処理
	 * 
	 * @param handle
	 * @param param
	 * @param textValue
	 * @return
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite changeRelation(SessionHandle handle, IRequestParameterReadWrite param, String textValue) throws Throwable {

		// パラメータ未設定の場合は処理しない
		if (param.getData(textValue) == null) {
			return param;
		}

		// 初期化
		init(handle, param, textValue);

		// 他事業者割引契約を検索しスマートバリュー情報を取得
		HashMap<String, Object> mapEKK2441B003 = getSmtvlInfo();

		// スマートバリュー登録有無を判定
		if (!existSmtvl(mapEKK2441B003)) {
			return param;	// 有効なスマートバリューの登録なし
		}

		// 紐付け変更
		chgSmtvlTgSvc(mapEKK2441B003);

		// スマートバリューが仮登録でない場合は異動情報を連携する
		if (!isSmtvlKariAdd(mapEKK2441B003)) {
			addSmtvlIdoInf();
		}

		// 処理終了
		return param;
	}

	/**
	 * 初期処理
	 * 
	 * @param handle
	 * @param param
	 * @param textValue
	 */
	private void init(SessionHandle handle, IRequestParameterReadWrite param, String textValue) {
		//  変数初期化
		this.sessionHandle = handle;
		this.requestParameter = param;
		this.fixedText = textValue;
		this.mapper = JKKAdchgMapperCC.getInstance();
		this.scCall = new ServiceComponentRequestInvoker();
	}

	/**
	 * CC用のパラメータを取得する
	 * 
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private Map<String, String> getParameter() throws Exception {
		return (Map<String, String>)this.requestParameter.getData(this.fixedText);
	}

	/**
	 * スマートバリュー情報取得
	 * 
	 * @return
	 * @throws Exception 
	 */
	private HashMap<String, Object> getSmtvlInfo() throws Exception {

		// 転居元で利用中のサービス契約番号を取得
		Map<String, String> paramMap = getParameter();
		String svcKeiNo = paramMap.get("moto_svc_kei_no");

		// EKK2441B003 他事業者割引契約一覧照会
		ArrayList<HashMap<String, Object>> listEKK2441B003 = getEKK2441B003(svcKeiNo);
		if (listEKK2441B003 == null || listEKK2441B003.isEmpty()) {
			return null;
		}

		return listEKK2441B003.get(0);
	}

	/**
	 * スマートバリュー登録有無判定
	 * 
	 * @param mapEKK2441B003 他事業者割引契約一覧照会（サービス契約番号）結果
	 * @return
	 */
	private boolean existSmtvl(HashMap<String, Object> mapEKK2441B003) {

		if (mapEKK2441B003 == null || mapEKK2441B003.isEmpty()) {
			return false;
		}

		// 仮登録中であればスマートバリュー登録あり
		if (isSmtvlKariAdd(mapEKK2441B003)) {
			return true;
		}

		String cncYmd = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_CNC_YMD);
		String dslYmd = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_DSL_YMD);

		if (!StringUtils.isEmpty(cncYmd) && !JKKStrConst.END_YMD_DEFAULT.equals(cncYmd)) {
			// 他事業者割引契約締結年月日：設定あり

			if (StringUtils.isEmpty(dslYmd) || JKKStrConst.END_YMD_DEFAULT.equals(dslYmd)) {
				// 他事業者割引契約解約年月日：未設定
	
				return true;	// スマートバリュー登録済みで解約もされていない
			}
		}

		return false;
	}

	/**
	 * スマートバリュー対象サービス契約の紐付け変更
	 * 
	 * @param mapEKK2441B003 他事業者割引契約一覧照会（サービス契約番号）結果
	 * @throws Exception 
	 */
	private void chgSmtvlTgSvc(HashMap<String, Object> mapEKK2441B003) throws Exception {

		// 他事業者割引契約番号取得
		String tajgsWribKeiNo = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_NO);
		String lastUpdDtm = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.LAST_UPD_DTM);

		// 他事業者割引契約対象契約取得
		ArrayList<HashMap<String, Object>> listEKK2451B001 = getEKK2451B001(tajgsWribKeiNo);
		if (listEKK2451B001 == null || listEKK2451B001.isEmpty()) {
			return;
		}

		// パラメータよりスマートバリュー対象のサービス契約番号を取得
		Map<String, String> paramMap = getParameter();
		String motoSvcKeiNo = paramMap.get("moto_svc_kei_no");
		String addSvcKeiNo = paramMap.get("add_svc_kei_no");

		// 転居元で利用中のサービスについて解約通知されていないか確認
		if (isDslNotified(listEKK2451B001, motoSvcKeiNo)) {
			return;		// 解約通知あり
		}
		
		for (HashMap<String, Object> mapEKK2451B001 : listEKK2451B001) {

			// 転居元で利用中のサービスの場合は紐付け変更不要
			String svcKeiNo = (String)mapEKK2451B001.get(EKK2451B001CBSMsg1List.SVC_KEI_NO);
			if (motoSvcKeiNo.equals(svcKeiNo)) {
				continue;
			}

			// 他事業者割引契約対象契約適用終了年月日が設定済の場合は更新不要
			String endYmd = (String)mapEKK2451B001.get(EKK2451B001CBSMsg1List.TAJGSWKEI_TGKEI_TENDYMD);
			if (!StringUtils.isEmpty(endYmd) && !JKKStrConst.END_YMD_DEFAULT.equals(endYmd)) {
				continue;
			}

			// 他事業者割引契約対象契約適用終了を更新
			String tajgswkeiTgkeiNo = (String)mapEKK2451B001.get(EKK2451B001CBSMsg1List.TAJGSWKEI_TGKEI_NO);
			HashMap<String, Object> mapEKK2451C010 = execEKK2451C010(tajgsWribKeiNo, tajgswkeiTgkeiNo, lastUpdDtm);

			// 更新後の更新年月日時分秒を最終更新年月日時分秒として保持する
			lastUpdDtm = (String)mapEKK2451C010.get(EKK2451C010CBSMsg.UPD_DTM);
		}

		// 転居先へ追加されるサービスを割引対象として登録する
		execEKK2451D010(tajgsWribKeiNo, addSvcKeiNo, lastUpdDtm);
	
	}

	/**
	 * 他事業者割引契約対象契約が解約通知されているか判定
	 * 
	 * @param listEKK2451B001	他事業者割引契約対象契約一覧照会結果
	 * @param motoSvcKeiNo		サービス契約番号
	 * @return
	 */
	private boolean isDslNotified(ArrayList<HashMap<String, Object>> listEKK2451B001, String motoSvcKeiNo) {

		for (HashMap<String, Object> mapEKK2451B001 : listEKK2451B001) {
			// サービス契約番号
			String svcKeiNo = (String)mapEKK2451B001.get(EKK2451B001CBSMsg1List.SVC_KEI_NO);
			if (!motoSvcKeiNo.equals(svcKeiNo)) {
				continue;	// 転居元で利用中のネット／電話ではない
			}
			// 解約他事業者通知年月日
			String dslTajsTchYmd = (String)mapEKK2451B001.get(EKK2451B001CBSMsg1List.DSL_TAJGS_TCH_YMD);
			if (!StringUtils.isEmpty(dslTajsTchYmd) && !JKKStrConst.END_YMD_DEFAULT.equals(dslTajsTchYmd)) {
				return true;	// 解約通知済み
			}
		}
		return false;
	}

	/**
	 * スマートバリュー仮登録判定
	 * 
	 * @param mapEKK2441B003 他事業者割引契約一覧照会（サービス契約番号）結果
	 * @return
	 */
	private boolean isSmtvlKariAdd(HashMap<String, Object> mapEKK2441B003) {

		if (mapEKK2441B003 == null || mapEKK2441B003.isEmpty()) {
			return false;
		}

		String mkmYmd = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_MKM_UK_YMD);	// 他事業者割引契約申込受付年月日
		String cnclYmd = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_CNCL_YMD);	// 他事業者割引契約キャンセル年月日
		String cncYmd = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_CNC_YMD);		// 他事業者割引契約締結年月日
		String dslYmd = (String)mapEKK2441B003.get(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_DSL_YMD);		// 他事業者割引契約解約年月日

		if (!StringUtils.isEmpty(mkmYmd) && !JKKStrConst.END_YMD_DEFAULT.equals(mkmYmd)) {
			// 申込受付年月日：設定あり

			if (StringUtils.isEmpty(cnclYmd) || JKKStrConst.END_YMD_DEFAULT.equals(cnclYmd)) {
				// キャンセル年月日：未設定

				if (StringUtils.isEmpty(cncYmd) || JKKStrConst.END_YMD_DEFAULT.equals(cncYmd)) {
					// 締結年月日：未設定

					if (StringUtils.isEmpty(dslYmd) || JKKStrConst.END_YMD_DEFAULT.equals(dslYmd)) {
						// 解約年月日：未設定
						
						return true;	// 仮登録中
					}
				}
			}
		}

		return false;
	}

	/**
	 * スマートバリュー異動情報登録
	 * 
	 * @throws Throwable 
	 */
	private void addSmtvlIdoInf() throws Throwable {

		// リクエストパラメータより各種パラメータを取得
		Map<String, String> paramMap = getParameter();
		String svcKeiNo = paramMap.get("add_svc_kei_no");
		String idoDiv = paramMap.get("ido_div");

		// パラメータ設定
		HashMap<String, Object> trgtData = new HashMap<String, Object>();
		trgtData.put(JKKSmtvlIdoInfAddConstCC.SVC_KEI_NO, svcKeiNo);
		trgtData.put(JKKSmtvlIdoInfAddConstCC.IDO_DIV, idoDiv);
		trgtData.put(JKKSmtvlIdoInfAddConstCC.PRG_STAT, JKKStrConst.CD00647_SHOSA_OK);
		trgtData.put(JKKSmtvlIdoInfAddConstCC.PRG_DTM, JCCBPCommon.getSysDateTimeStamp());

		// スマートバリュー異動情報登録処理
		this.requestParameter.setData(FIXED_TEXT_ADD_SMTVL_IDO_INFO, trgtData);
		JKKBpCommon.addSmtvlIdoInf(this.sessionHandle, this.requestParameter, trgtData, FIXED_TEXT_ADD_SMTVL_IDO_INFO);
	}

	/**
	 * EKK2441B003 他事業者割引契約一覧照会（サービス契約番号）
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @return
	 * @throws Exception
	 */
	private ArrayList<HashMap<String, Object>> getEKK2441B003(String svcKeiNo) throws Exception {

		// パラメータ設定
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
		HashMap<String, Object> reqMap = mapper.setEKK2441B003(this.requestParameter, this.fixedText, condMap);

		// S-IF呼出
		Map<?, ?> resMap = scCall.run(reqMap, this.sessionHandle);
		ArrayList<HashMap<String, Object>> listEKK2441B003 = mapper.getEKK2441B003(this.requestParameter, this.fixedText, resMap);
		mapper.scResultCheck(this.requestParameter);
		
		return listEKK2441B003;
	}

	/**
	 * EKK2451B001 他事業者割引契約対象契約一覧照会
	 * 
	 * @param tajgsWribKeiNo 他事業者割引契約番号
	 * @return
	 * @throws Exception
	 */
	private ArrayList<HashMap<String, Object>> getEKK2451B001(String tajgsWribKeiNo) throws Exception {

		// パラメータ設定
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(EKK2451B001CBSMsg.KEY_TAJGS_WRIB_KEI_NO, tajgsWribKeiNo);
		HashMap<String, Object> reqMap = mapper.setEKK2451B001(this.requestParameter, this.fixedText, condMap);

		// S-IF呼出
		Map<?, ?> resMap = scCall.run(reqMap, this.sessionHandle);
		ArrayList<HashMap<String, Object>> listEKK2451B001 = mapper.getEKK2451B001(this.requestParameter, this.fixedText, resMap);
		mapper.scResultCheck(this.requestParameter);
		
		return listEKK2451B001;
	}

	/**
	 * EKK2451C010 他事業者割引契約対象契約適用終了
	 * 
	 * @param tajgsWribKeiNo		他事業者割引契約番号
	 * @param tajgswkeiTgkeiNo		他事業者割引契約対象契約番号
	 * @param lastUpdDtm			最終更新年月日時分秒
	 * @return
	 * @throws Exception
	 */
	private HashMap<String, Object> execEKK2451C010(String tajgsWribKeiNo, String tajgswkeiTgkeiNo, String lastUpdDtm) throws Exception {

		// パラメータ設定
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(EKK2451C010CBSMsg.TAJGS_WRIB_KEI_NO,	tajgsWribKeiNo);
		condMap.put(EKK2451C010CBSMsg.TAJGSWKEI_TGKEI_NO,	tajgswkeiTgkeiNo);
		condMap.put(EKK2451C010CBSMsg.UPD_DTM_BF,			lastUpdDtm);
		HashMap<String, Object> reqMap = mapper.setEKK2451C010(this.requestParameter, this.fixedText, condMap);

		// S-IF呼出
		Map<?, ?> resMap = scCall.run(reqMap, this.sessionHandle);
		HashMap<String, Object> mapEKK2451C010 = mapper.getEKK2451C010(this.requestParameter, this.fixedText, resMap);
		mapper.scResultCheck(this.requestParameter);
		
		return mapEKK2451C010;
	}

	/**
	 * EKK2451D010 他事業者割引契約対象契約登録
	 * 
	 * @param tajgsWribKeiNo	他事業者割引契約番号
	 * @param svcKeiNo			サービス契約番号
	 * @param lastUpdDtm		最終更新年月日時分秒
	 * @return
	 * @throws Exception
	 */
	private HashMap<String, Object> execEKK2451D010(String tajgsWribKeiNo, String svcKeiNo, String lastUpdDtm) throws Exception {

		// パラメータ設定
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(EKK2451D010CBSMsg.TAJGS_WRIB_KEI_NO,	tajgsWribKeiNo);
		condMap.put(EKK2451D010CBSMsg.SVC_KEI_NO,			svcKeiNo);
		condMap.put(EKK2451D010CBSMsg.UPD_DTM_BF,			lastUpdDtm);
		HashMap<String, Object> reqMap = mapper.setEKK2451D010(this.requestParameter, this.fixedText, condMap);

		// S-IF呼出
		Map<?, ?> resMap = scCall.run(reqMap, this.sessionHandle);
		HashMap<String, Object> mapEKK2451D010 = mapper.getEKK2451D010(this.requestParameter, this.fixedText, resMap);
		mapper.scResultCheck(this.requestParameter);
		
		return mapEKK2451D010;
	}
}
