/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKBlockingInfoMailSks
*	ソースファイル名	：JBSbatKKBlockingInfoMailSks.java
*	作成者				：富士通
*	作成日				：2020年03月26日
*＜機能概要＞
*	ブロッキング情報通知メール作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v49.00.00   2020/03/26  FJ)中原   ANK-3834-00-00_マルウェアブロッキング
*   v54.00.00   2021/07/05  FJ)平野   ANK-4043-00-00_マルウェアブロッキング通知メール送信方法の変更
*   v71.00.00   2024/04/22  GDC)ml.alcantara   ANK-4468-00-00 _eo光ネット「シンプルプラン」追加対応
*   v71.00.01   2024/07/29  FJ)張     ANK-4468-00-01 _eo光ネット「シンプルプラン」追加対応
*********************************************************************/
package eo.business.service;


import java.util.HashSet;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JKKBatConst;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.business.util.file.JBSbatKKIFE398;
import eo.common.constant.JPCBatchMessageConstant;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKBlockingInfoMailSks extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	

	/** ブロッキング情報通知メールファイルオブジェクト(出力ファイル) */
	private JBSbatOutputFileUtil kkife398FileObjOut = null;
	/** 改行コード */
	private static final String LF  = "LF";
	/** メールコード */
	private static final String MAIL_CD  = "KKM1000026";

	/** テーブル(サービス契約内訳)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_UCWK = "KK_T_SVC_KEI_UCWK";
	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_UCWK = null;
// ANK-4043-00-00 DEL START
	/** SQL定義キー(KK_SELECT_138)*/
//	private static final String KK_T_SVC_KEI_UCWK_KK_SELECT_138 = "KK_SELECT_138";
// ANK-4043-00-00 DEL END
	/** テーブル(メール)*/
	private static final String D_TBL_NAME_CC_M_MAIL = "CC_M_MAIL";
	/** テーブルアクセスクラス(メール)*/
	private JBSbatSQLAccess db_CC_M_MAIL = null;
	/** SQL定義キー(KK_SELECT_004)*/
	private static final String CC_M_MAIL_KK_SELECT_004 = "KK_SELECT_004";
	// ANK-4468-00-00 ADD START	
	/** テーブル(連絡先)*/
	private static final String D_TBL_NAME_CK_T_RRKS  = "CK_T_RRKS";
	/** テーブルアクセスクラス(連絡先)*/
	private JBSbatSQLAccess db_CK_T_RRKS = null;
	/** SQL定義キー(KK_SELECT_012)*/
	private static final String CK_T_RRKS_KK_SELECT_012 = "KK_SELECT_012";
	// ANK-4468-00-00 ADD END
// ANK-4043-00-00 ADD START	
// --------------------------------------------------------------
	// 入力ファイル
	private JBSbatInputFileUtil inputFile = null;
	// 定義ファイル
	private JBSbatDefFileUtil defFile= null;
//--------------------------------------------------------------
// ANK-4043-00-00 ADD END
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
		db_CC_M_MAIL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL);
		// ANK-4468-00-00 ADD START
		db_CK_T_RRKS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_RRKS);
		// ANK-4468-00-00 ADD END

		// KKIFE398ファイル作成
		this.kkife398FileObjOut = new JBSbatOutputFileUtil(freeItems[0]);
		this.kkife398FileObjOut.setEncode(JKKBatConst.SJIS);
		this.kkife398FileObjOut.setLine(LF);
		this.kkife398FileObjOut.createWriter();
// ANK-4043-00-00 ADD START
		// 入力ファイル
		inputFile = new JBSbatInputFileUtil(freeItems[1]);

		// 定義ファイル
		defFile= new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue("IND") + freeItems[2], inputFile);
// ANK-4043-00-00 ADD END
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{

		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		try
		{

			// バッチ運用日付の取得
			String batOpeDate = super.opeDate;
			// バッチ運用日付の前月の取得
			String preMonth  = JBSbatDateUtil.adjustMonth(super.opeDate, -1).substring(0, 6);
			
//  ANK-4043-00-00 DEL START
//			// ブロッキングを取得
//			JBSbatCommonDBInterface blockingInfo = executeKK_T_SVC_KEI_UCWK_KK_SELECT_138( new String[]{ batOpeDate, preMonth });
// ブロッキング情報が取得できない場合、処理を終了
//			if ( blockingInfo == null )
//			{
//				return null;
//			}
//  ANK-4043-00-00 DEL END

			// メール情報を取得
			JBSbatCommonDBInterface mailInfo = executeCC_M_MAIL_KK_SELECT_004(new String[]{ batOpeDate });
			if ( mailInfo == null )
			{
				super.commonItem.setErrFlg(true);
				// %1%テーブルに%2%が存在しません。
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0210CE, new String[] { "メール", "メールコード：" + MAIL_CD });
				throw new JBSbatBusinessError();
			}
			
//  ANK-4043-00-00 MOD START
//			while ( blockingInfo != null )
			int row = 0;
			inputFile.createReader();
			while ( inputFile.ready() )
//  ANK-4043-00-00 MOD END
			{
//  ANK-4043-00-00 ADD START
				row++;
				String line = inputFile.readLine();
				JBSbatServiceInterfaceMap blockingInfo = defFile.lineToObject(line, inputFile, row);
//  ANK-4043-00-00 ADD END
				// ANK-4468-00-00 ADD START
				String svcKeiNo = blockingInfo.getString(JBSbatKKIFE398.SVC_KEI_NO);
				// メールアドレス取得（連絡先）
				// ANK-4468-00-01 MOD START
				//String  contactMlad = executeCK_T_RRKS_KK_SELECT_012( new String[]{ batOpeDate, svcKeiNo});
				String  contactMlad = executeCK_T_RRKS_KK_SELECT_012( new String[]{ batOpeDate, svcKeiNo, batOpeDate });
				//ANK-4468-00-01 MOD END
				// ANK-4468-00-00 ADD END
				// ブロッキング情報通知メールを作成
				// ANK-4468-00-00 MOD START
				//writeBlockingMail(blockingInfo, mailInfo, preMonth);
				writeBlockingMail(blockingInfo, mailInfo, preMonth, contactMlad);
				// ANK-4468-00-00 MOD END
//  ANK-4043-00-00 DEL START
//				blockingInfo = db_KK_T_SVC_KEI_UCWK.selectNext();
//  ANK-4043-00-00 DEL END
			}
			
		}
		catch(Exception e)
		{
			super.commonItem.setErrFlg(true);
			throw new JBSbatBusinessError();
		}

		return outputBean;
	}
	
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		// DBクローズ処理
		db_KK_T_SVC_KEI_UCWK.close();
		db_CC_M_MAIL.close();
		// ANK-4468-00-00 ADD START
		db_CK_T_RRKS.close();
		// ANK-4468-00-00 ADD END
	
	}

	/**
	 * KKIFE398のブロッキング情報メールの作成
	 * @param  blockingInfo
	 * @param  mailInfo
	 * @param  preMonth
	 * @throws Exception
	 */
//  ANK-4043-00-00 MOD START
//	private void writeBlockingMail(JBSbatCommonDBInterface blockingInfo, JBSbatCommonDBInterface mailInfo, String preMonth) throws Exception
	// ANK-4468-00-00 MOD START
	//private void writeBlockingMail(JBSbatServiceInterfaceMap blockingInfo, JBSbatCommonDBInterface mailInfo, String preMonth) throws Exception
	private void writeBlockingMail(JBSbatServiceInterfaceMap blockingInfo, JBSbatCommonDBInterface mailInfo, String preMonth, String contactMlad) throws Exception
	// ANK-4468-00-00 MOD END
//  ANK-4043-00-00 MOD END
	{
		StringBuilder str = new StringBuilder();
		// サービス契約番号
		appendStr(str, blockingInfo.getString(JBSbatKKIFE398.SVC_KEI_NO), 10, true, true);
		// メール宛先
		appendStr(str, blockingInfo.getString(JBSbatKKIFE398.SENDS_MLAD), 64, true, true);
		// メール送信者名
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.SENDM_MLAD_DSP_NM), 100, true, true);
		// メール送信者
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.SENDM_MLAD), 64, true, true);
		// メール返信先
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.HNSIN_MLAD), 64, true, true);
		// エラーメール返信先
		appendStr(str, mailInfo.getString("ERR_MLAD"), 64, true, true);
		// ＢＣＣ
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.BCC_MLAD), 64, true, true);
		// メール題名
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.MAIL_TITLE), 500, true, true);
		// メール本文
		String yyyyMm = preMonth.substring(0, 4) + "年" + String.valueOf(Integer.parseInt(preMonth.substring(4, 6))) + "月";
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.MAIL_TEXT).replaceFirst("%", yyyyMm), 4200, true, true);
		// 対応記録タイトル
		appendStr(str, mailInfo.getString(JBSbatKKIFE398.TAIO_KIROK_TITLE), 80, false, true);

		this.kkife398FileObjOut.write(str.toString());
		// ANK-4468-00-00 ADD START
		// データ追加済メールアドレスハッシュマップ初期化
		HashSet<String> addedMail = new HashSet<String>();
		// ハッシュセットにデータ追加済メールアドレスを追加
		addedMail.add(blockingInfo.getString(JBSbatKKIFE398.SENDS_MLAD));
		if (contactMlad != null && !addedMail.contains(contactMlad))
		{
			StringBuilder str2 = new StringBuilder();
			// サービス契約番号
			appendStr(str2, blockingInfo.getString(JBSbatKKIFE398.SVC_KEI_NO), 10, true, true);
			// メール宛先
			appendStr(str2, contactMlad, 64, true, true);
			// メール送信者名
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.SENDM_MLAD_DSP_NM), 100, true, true);
			// メール送信者
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.SENDM_MLAD), 64, true, true);
			// メール返信先
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.HNSIN_MLAD), 64, true, true);
			// エラーメール返信先
			appendStr(str2, mailInfo.getString("ERR_MLAD"), 64, true, true);
			// ＢＣＣ
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.BCC_MLAD), 64, true, true);
			// メール題名
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.MAIL_TITLE), 500, true, true);
			// メール本文
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.MAIL_TEXT).replaceFirst("%", yyyyMm), 4200, true, true);
			// 対応記録タイトル
			appendStr(str2, mailInfo.getString(JBSbatKKIFE398.TAIO_KIROK_TITLE), 80, false, true);

			this.kkife398FileObjOut.write(str2.toString());
		}
		// ANK-4468-00-00 ADD END
	}


	/**
	 * 文字列を連結します。
	 * 
	 * @param str
	 *            文字列
	 * @param value
	 *            連結対象の文字列
	 * @param len
	 *            桁数
	 * @param continueFlg
	 *            継続フラグ
	 * @throws Exception 
	 */
	private void appendStr(StringBuilder str, String value, int len, boolean continueFlg, boolean doubleQuoteFlg) throws Exception
	{
		String preValue = value;

		if (null == value)
		{
			preValue = "";
		}
		
		if (doubleQuoteFlg)
		{
			str.append("\"");
		}
		
		str.append(adjustCharSize(preValue, len));
		
		if (doubleQuoteFlg)
		{
			str.append("\"");
		}

		if (continueFlg)
		{
			str.append(JBSbatKKConst.STR_COMMA);
		}
	}

	/**
	 * 文字列を指定された桁数に調整する。<BR>
	 * 指定サイズが文字列の桁数より小さい場合は、文字列の語尾を切り捨てる。
	 * <BR>
	 * @param para 調整前の文字列
	 * @param len 指定桁数（桁数）
	 * @param encode 文字コード（ＯＳ準拠の場合は""（空）を指定）
	 * @return String 調整後の文字列
	 * @throws Exception
	 */
	public String adjustCharSize(String para, int len)
			throws Exception
	{
		String retStr = "";
		if (null == para)
		{
			return retStr;
		}
		if (0 >= len)
		{
			return retStr;
		}

		// 入力文字列の桁数を取得する
		int paralen = para.length();

		// 入力文字列を返却文字列に設定
		retStr = para;
		
		// 入力文字列の桁数 ＞ 指定桁数の場合
		if ( paralen > len )
		{ 
			// 指定桁数分の文字列を生成する
			retStr = para.substring(0, len);
		}

		return retStr;
	}
//  ANK-4043-00-00 DEL START
//	/**
//	 * SQLKEY(KK_T_SVC_KEI_UCWK_KK_SELECT_138)でDBアクセスを行います。<br>
//	 * @param param バイント変数の値配列。
//	 * @throws Exception 業務サービス内で発生した例外全般。
//	 */
//	private JBSbatCommonDBInterface executeKK_T_SVC_KEI_UCWK_KK_SELECT_138(Object[] param) throws Exception
//	{
//		
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		JBSbatCommonDBInterface dbInterface = null;
//		paramList.setValue(param[1].toString());
//		paramList.setValue(param[0].toString());
//
//		// DBアクセスを実行します
//		db_KK_T_SVC_KEI_UCWK.selectBySqlDefine(paramList, KK_T_SVC_KEI_UCWK_KK_SELECT_138);
//		
//		dbInterface = db_KK_T_SVC_KEI_UCWK.selectNext();
//		
//		// 業務パラメータ設定値の取得
//		if(dbInterface == null)
//		{
//			return null;
//		}
//		
//		return dbInterface;
//		
//	}
//  ANK-4043-00-00 DEL END
	/**
	 * SQLKEY(CC_M_MAIL_KK_SELECT_004)でDBアクセスを行います。<br>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeCC_M_MAIL_KK_SELECT_004(Object[] param) throws Exception
	{
		
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface dbInterface = null;
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());
		paramList.setValue(MAIL_CD);
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CC_M_MAIL.selectBySqlDefine(paramList, CC_M_MAIL_KK_SELECT_004);
		
		dbInterface = db_CC_M_MAIL.selectNext();
		
		if(dbInterface == null)
		{
			return null;
		}
		
		return dbInterface;
		
	}
	// ANK-4468-00-00 ADD START
	/**
	 * SQLKEY(KK_SELECT_012)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	運用日
	 *		 	サービス契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String executeCK_T_RRKS_KK_SELECT_012(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface dbInterface = null;
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		//ANK-4468-00-01 ADD START
		paramList.setValue(param[2].toString());
		//ANK-4468-00-01 ADD END

		// DBアクセスを実行します
		db_CK_T_RRKS.selectBySqlDefine(paramList, CK_T_RRKS_KK_SELECT_012);
		
		dbInterface = db_CK_T_RRKS.selectNext();
		
		if(dbInterface == null || dbInterface.getMapSize() == 0 )
		{
			return null;
		}
		
		return dbInterface.getString("MLAD");
	}
	// ANK-4468-00-00 ADD END

}