/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKDslSimpleSendMailCC.java
*	ソースファイル名：JKKDslSimpleSendMailCC.java.java
*	作成者			：富士通
*	日付			：2024年10月04日
*＜機能概要＞ 
*	シンプルプラン解約受付メール送信の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*  v1.00.00    2024/10/04   富士通      新規作成
*  v74.00.00   2025/02/17	FJ)藤井    【ANK-4656-00-00】eo光シンプルプラン提供(STEP3)
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECC0021D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECC0021D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECC0021D010CBSMsg2List;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1121C011CBSMsg;

/**
 * シンプルプラン解約受付メール送信の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JKKDslSimpleSendMailCC extends AbstractCommonComponent
{
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKDslSimpleSendMailMapperCC mapper = null;
	
	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;
	
	/** 料金コースコード　A97：シンプルプラン１０Ｇ                                   */
	private static final String PCRS_CD_SIMPLE_10G = "A97";
	
	/** 料金コースコード　A99：シンプルプラン１０Ｇ　Netflix                          */
	private static final String PCRS_CD_SIMPLE_10G_Netflix = "A99";
		
	/** ステータス(各スキーマのステータス)：解約済         */
	public static final String STAT_DSL_ZUMI    = "910";
	/** ステータス(各スキーマのステータス)：キャンセル     */
	public static final String STAT_CANCEL_ZUMI = "920";
	
	/** 異動区分(撤去（解約）) */
	private static final String IDO_DIV_VALUE_00006 = "00006";
	/** 異動区分(工事情報訂正) */
	private static final String IDO_DIV_VALUE_00035 = "00035";
	
	/** 工事案件種別コード（撤去（解約））*/
	private static final String KOJIAK_SBT_CD_002 = "002";
	
	/** メールコード*/
	private static final String DSL_MAIL_CD = "KKM1000055";
	
	/** 半角スペース*/
	private static final String HANKAKU_SPACE = " ";
	
	/**
	 * シンプルプラン解約受付メール送信処理を行います。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeDslSimpleSendMailInfo(SessionHandle handle,
													IRequestParameterReadWrite param,
													String fixedText) throws Throwable
	{
		
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKDslSimpleSendMailMapperCC();
		}
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}
		
		// リクエストパラメータの取得処理
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		if (inMap == null)
		{
			return param;
		}
		
		IRequestParameterReadWrite retParam = param;
		
		
		// サービス契約一意照会
		HashMap<String, Object> mapEKK0081A010 = this.mapper.editInMsgEKK0081A010(param, inMap, fixedText);
		Map<?, ?> rsltEKK0081A010 = this.scCall.run(mapEKK0081A010, handle);
		this.mapper.editResultRPEKK0081A010(rsltEKK0081A010, param, fixedText);
		errChk(rsltEKK0081A010);
		
		// 業務データの取得
		CAANMsg workEKK0081A010 = getWorkCAANMsg(rsltEKK0081A010);
		CAANMsg[] msgEKK0081A010List = workEKK0081A010.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		if (0 == msgEKK0081A010List.length)
		{
			return retParam;
		}
		CAANMsg msgEKK0081A010 = msgEKK0081A010List[0];
		
		// サービス契約ステータス
		String svcKeiStat = msgEKK0081A010.getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
		// 変更前解約希望日
		String dslYmdOld = (String)inMap.get("dsl_ymd_old");
		// 解約希望日
		String dslKiboYmd = (String)inMap.get("dsl_kibo_ymd");
		// 異動区分
		String idoDiv = (String)inMap.get("ido_div");
		// 工事案件種別コード
		String kojiakSbtCd = (String)inMap.get("kojiak_sbt_cd");
		
		// 異動区分が撤去（解約）、工事情報訂正で工事種別コードが（撤去（解約）)以外の場合
		if (!IDO_DIV_VALUE_00006.equals(idoDiv) && !(IDO_DIV_VALUE_00035.equals(idoDiv) && KOJIAK_SBT_CD_002.equals(kojiakSbtCd)))
		{
			return retParam;
		}
		// ステータスが解約済、キャンセル済の場合
		if (STAT_DSL_ZUMI.equals(svcKeiStat) || STAT_CANCEL_ZUMI.equals(svcKeiStat))
		{
			return retParam;
		}
		
		// 解約希望日が変更されていない場合
		if (dslYmdOld.equals(dslKiboYmd))
		{
			return retParam;
		}
		
		// シンプルプラン判定
		String simplePrcsCd = null;
		simplePrcsCd = msgEKK0081A010.getString(EKK0081A010CBSMsg1List.PCRS_CD);
		if (!simplePrcsCd.equals(PCRS_CD_SIMPLE_10G_Netflix) && !simplePrcsCd.equals(PCRS_CD_SIMPLE_10G))
		{
			return retParam;
		}
		
		// お客様情報照会（PMP連携用）実行処理
		HashMap<String, Object> mapECK0011B050 = this.mapper.editInMsgECK0011B050(param, inMap, fixedText);
		Map<?, ?> rsltECK0011B050 = this.scCall.run(mapECK0011B050, handle);
		this.mapper.editResultRPECK0011B050(rsltECK0011B050, param, fixedText);
		errChk(rsltECK0011B050);
		// 業務データの取得処理
		CAANMsg workECK0011B050 = getWorkCAANMsg(rsltECK0011B050);
		CAANMsg[] msgECK0011B050List = workECK0011B050.getCAANMsgList(ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
		
		// メールアドレス変数初期化
		Set<String> mladSet = new HashSet<String>();
		
		// コンテンツ連絡先メールアドレスの存在チェック
		if (!rsltSifList(msgECK0011B050List))
		{
			// メールアドレスを取得し、設定する。
			mladSet = getRrksMailAddress(msgECK0011B050List);
		}

		for (String contentsMlad : mladSet)
		{
			HashMap<String, Object> sendMailInfo = new HashMap<String, Object>();
			ArrayList<HashMap> ecc0021D010List1 = new ArrayList<HashMap>();
			ArrayList<HashMap> ecc0021D010List2 = new ArrayList<HashMap>();
			ArrayList<HashMap> ecc0021D010List3 = new ArrayList<HashMap>();
			ArrayList<HashMap> ecc0021D010List4 = new ArrayList<HashMap>();
			ArrayList<HashMap> ecc0021D010List5 = new ArrayList<HashMap>();
			
			//メールコード
			sendMailInfo.put(ECC0021D010CBSMsg.MAIL_CD, DSL_MAIL_CD);
			// メール送信パターンコード　01:リアルタイム
			sendMailInfo.put(ECC0021D010CBSMsg.MAIL_SEND_PATTERN_CD, "01");
			// 機能コード
			sendMailInfo.put(ECC0021D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
			
			// コンテンツ用メールアドレス
			HashMap contentsMailListMap = new HashMap();
			contentsMailListMap.put(ECC0021D010CBSMsg1List.MLAD, contentsMlad);
			// メールアドレス設定フィールドコード　01：TO
			contentsMailListMap.put(ECC0021D010CBSMsg1List.MLAD_SET_FIELD_CD, "01");
			ecc0021D010List1.add(contentsMailListMap);
			sendMailInfo.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG1LIST, ecc0021D010List1);
			
			// メール本文の置換文字列に解約希望日を設定
			HashMap dslKiboYmdMap = new HashMap();
			dslKiboYmdMap.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, setdslKiboYmd(dslKiboYmd));
			ecc0021D010List2.add(dslKiboYmdMap);
			
			// サービス契約回線内訳一覧照会(現在利用中)実行処理
			HashMap<String, Object> mapEKK0251B003 = this.mapper.editInMsgEKK0251B003(param, inMap, fixedText);
			Map<?, ?> rsltEKK0251B003 = this.scCall.run(mapEKK0251B003, handle);
			this.mapper.editResultRPEKK0251B003(rsltEKK0251B003, param, fixedText);
			errChk(rsltEKK0251B003);
			CAANMsg workEKK0251B003 = getWorkCAANMsg(rsltEKK0251B003);
			CAANMsg msgEKK0251B003 = workEKK0251B003.getCAANMsgList(EKK0251B003CBSMsg.EKK0251B003CBSMSG1LIST)[0];
			
			// メール本文の置換文字列に郵便番号を設定
			HashMap pcdMap = new HashMap();
			String placePcd = msgEKK0251B003.getString(EKK0251B003CBSMsg1List.KAISEN_PLACE_PCD);
			pcdMap.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, setkeishaPcd(placePcd));
			ecc0021D010List2.add(pcdMap);
			// メール本文の置換文字列に住所を設定
			HashMap adressMap = new HashMap();
			List<String> LOCATION_ADRS_ITEM_LIST = Arrays.asList(EKK0251B003CBSMsg1List.KAISEN_PLACE_STATE_NM
																, EKK0251B003CBSMsg1List.KAISEN_PLACE_CITY_NM
																, EKK0251B003CBSMsg1List.KAISEN_PLACE_OAZTSU_NM
																, EKK0251B003CBSMsg1List.KAISEN_PLACE_AZCHO_NM
																, EKK0251B003CBSMsg1List.KAISEN_PLACE_BNCHIGO 
																, EKK0251B003CBSMsg1List.KAISEN_PLACE_ADRTTM 
																, EKK0251B003CBSMsg1List.KAISEN_PLACE_ADRRM);
			
			adressMap.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, getAlladdress(msgEKK0251B003,LOCATION_ADRS_ITEM_LIST));
			
			ecc0021D010List2.add(adressMap);
			
			sendMailInfo.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG2LIST, ecc0021D010List2);
			sendMailInfo.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG3LIST, ecc0021D010List3);
			sendMailInfo.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG4LIST, ecc0021D010List4);
			sendMailInfo.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG5LIST, ecc0021D010List5);
			
			param.setData("dslMailCC", sendMailInfo);
			
			if (JPCModelConstant.FUNC_CD_1.equals((String)inMap.get("func_code")))
			{
				// メール送信情報登録処理
				JKKSendMailCC mailSendCC = new JKKSendMailCC();
				mailSendCC.sendMailCC(handle, param, "dslMailCC");
				// ANK-4656-00-00 ADD START
				// メールID採番処理
				HashMap<String, Object> mapEKK1121C011 = this.mapper.editInMsgEKK1121C011(param, inMap, fixedText);
				Map<?, ?> rsltEKK1121C011 = this.scCall.run(mapEKK1121C011, handle);
				this.mapper.editResultRPEKK1121C011(rsltEKK1121C011, param, fixedText);
				errChk(rsltEKK1121C011);
				// 業務データの取得処理
				CAANMsg workEKK1121C011 = getWorkCAANMsg(rsltEKK1121C011);
				String mailId = workEKK1121C011.getString(EKK1121C011CBSMsg.MAIL_ID);
				
				// メール情報登録処理
				HashMap<String, Object> mapEKK1121D010 = this.mapper.editInMsgEKK1121D010(param, inMap, fixedText, mailId, contentsMlad, DSL_MAIL_CD, msgECK0011B050List, sendMailInfo);
				Map<?, ?> rsltEKK1121D010 = this.scCall.run(mapEKK1121D010, handle);
				this.mapper.editResultRPEKK1121D010(rsltEKK1121D010, param, fixedText);
				errChk(rsltEKK1121D010);
				// ANK-4656-00-00 ADD END
			}
		}
		return retParam;
	}

	
	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private static CAANMsg getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate;
	}
	
	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private static void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス
		int templateStatus = template.getInt(EKK0081A010CBSMsg.STATUS);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = "INVALID_RETURN_MESSAGE";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * サービスIFの結果が件数判定
	 * 
	 * @param resultList サービスインターフェイス結果List
	 * @return true   NULLまたは、空
	 *          false 上記以外
	 */
	private boolean rsltSifList(CAANMsg[] resultList) throws Throwable
	{
		if (resultList == null || resultList.length == 0)
		{
			return true;
		}
		return false;
	}
	
	/**
	 * 重複しない連絡先メールアドレスを全て取得する。
	 * 
	 * @param eck0201b050List お客様情報照会(PMP連携用)リスト
	 * @return 連絡先メールアドレスセット
	 * @throws Exception
	 */
	private Set<String> getRrksMailAddress(CAANMsg[] eck0011b050List) throws Exception
	{
		Set<String> mladSet = new HashSet<String>();
		
		if (eck0011b050List == null || eck0011b050List.length == 0)
		{
			return mladSet;
		}
		
		for (CAANMsg eck0011b050 : eck0011b050List)
		{
			if (eck0011b050.getString(ECK0011B050CBSMsg1List.MLAD) != null 
					&& eck0011b050.getString(ECK0011B050CBSMsg1List.MLAD).equals(eck0011b050.getString(ECK0011B050CBSMsg1List.CHGECHU_MLAD)))
			{
				continue;
			}
			// 取得したメールアドレスがNULLか空でなければセットに格納
			if (!JKKStringUtil.isNullBlank(eck0011b050.getString(ECK0011B050CBSMsg1List.MLAD)))
			{
				mladSet.add(eck0011b050.getString(ECK0011B050CBSMsg1List.MLAD));
			}
		}
		return mladSet;
	}
	
	/**
	 * yyyyMMdd形式からyyyy年MM月dd日形式に変換
	 * @return dslKiboYmd  解約希望日(yyyyMMdd形式)
	 * @throws Exception
	 */
	private String setdslKiboYmd(String dslKiboYmd)
	{
		
		if (StringUtils.isEmpty( dslKiboYmd ))
		{
			return null;
		}
		else
		{
			String dslKiboY = dslKiboYmd.substring(0, 4);
			String dslKiboM = dslKiboYmd.substring(4, 6);
			String dslKiboD = dslKiboYmd.substring(6, 8);

			// 解約希望日を設定
			String dslKiboYmd2 = dslKiboY + "年" + dslKiboM + "月" + dslKiboD + "日" ;
			
			return dslKiboYmd2;
		}
	}
	
	/**
	 * 郵便番号に「-」を付与して設定する
	 * @return keishaPcd  郵便番号設定キー
	 * @throws Exception
	 */
	private String setkeishaPcd(String placePcd)
	{
		
		if(StringUtils.isEmpty( placePcd ))
		{
			return null;
		}
		else
		{
			String keishaPcdBf = placePcd.substring(0, 3);
			String keishaPcdAf = placePcd.substring(3, 7);

			// 郵便番号を設定
			String keishaPcd2 = keishaPcdBf + "-" + keishaPcdAf ;
			
			return keishaPcd2;
		}
	}
	
	/**
	 * 住所結合処理です。
	 * <br>
	 * @param msgEKK0251B003 サービス契約回線内訳一覧照会(現在利用中)結果
	 * @param itemList 取得項目リスト
	 * @return 結合結果
	 */
	private String getAlladdress(CAANMsg msgEKK0251B003, List<String> itemList)
	{
		// 住所(結合)
		StringBuffer allAddress = new StringBuffer();

		for (int i = 0; i < itemList.size(); i++)
		{
			String adressNm = itemList.get(i);

			if (!JFUBPCommon.isNull(msgEKK0251B003.getString(adressNm)))
			{
				// 建物名 || 部屋番号が空ではない場合
				if (adressNm.equals(EKK0251B003CBSMsg1List.KAISEN_PLACE_ADRTTM) || adressNm.equals(EKK0251B003CBSMsg1List.KAISEN_PLACE_ADRRM))
				{
					allAddress.append(HANKAKU_SPACE);
				}
				// 値が設定されていれば結合する
				allAddress.append(msgEKK0251B003.getString(adressNm));
			}
		}

		return allAddress.toString();
	}
}
