/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatFUAutoMailSend
*	ソースファイル名	：JBSbatFUAutoMailSend.java
*	作成者				：富士通
*	作成日				：2012年03月22日
*＜機能概要＞
*　メール自動返信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/03/22   富士通		新規作成
*	v4.01.00	2013/01/18   FJ）藤原	【ST2-2013-0000033】
*	v4.02.00	2013/01/22   FJ）大塚	【IT1-2013-0000254】
*	v5.01.00	2013/06/05   FJ）西川	【IT1-2013-0001254】
*   v7.00       2014/01/27   FJ）中谷   【OM-2014-0000310】メール送信登録の別トランザクション対応
*   v32.00.00   2017/05/29   FJ) 謝     【ANK-3057-00-00】自動送信メールの文面変更
*********************************************************************/
package eo.business.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.regex.Pattern;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JFUBatCommon;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.application.JCCbatFrameworkException;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatFUAutoMailSend extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * サービスID(工事進捗確認用Webアクセス認証キー登録)
	 */
	private static final String SERVICE_ID_FUSV0222 = "FUSV0222";

	/** サービスコンポーネント名(工事進捗確認用Webアクセス認証キー登録) */
	private static final String SC_NAME_FUSV0222 = "FUSV022201SC";

	/**
	 * サービスID(メール送信情報登録)
	 */
	private static final String SERVICE_ID_FUSV0278 = "FUSV0278";

	/** サービスコンポーネント名(メール送信情報登録) */
	private static final String SC_NAME_FUSV0278 = "FUSV027801CC";

	/** メッセージキー*/
	private static final String EFUB0150KE = JPCBatchMessageConstant.EFUB0150KE;

	/** メッセージキー*/
	private static final String EFUB0160JW = JPCBatchMessageConstant.EFUB0160JW;

	/** メッセージキー*/
	private static final String EFUB0170KE = JPCBatchMessageConstant.EFUB0170KE;

	/** メッセージキー*/
	private static final String EFUB0180KE = JPCBatchMessageConstant.EFUB0180KE;

	/** メッセージキー*/
	private static final String EFUB0190KE = JPCBatchMessageConstant.EFUB0190KE;

	/** メッセージキー*/
	private static final String EFUB0200AI = JPCBatchMessageConstant.EFUB0200AI;

	/** メッセージキー*/
	private static final String EFUB0060AI = JPCBatchMessageConstant.EFUB0060AI;

	/** SC処理結果(正常)*/
	private static final String SC_RESULT_ERR_0 = "0000";

	/** SC処理結果(異常)*/
	private static final String SC_RESULT_ERR_1 = "1";

// ANK-3057-00-00 DEL START
//	// IT1-2013-0000254 Otsuka 2013/01/22 start
//	/** メール表示用キー Webからのお問い合わせ */
//	private static final String ML_URL_WEB = "FU_BAT_ML_URL_WEB";
// ANK-3057-00-00 DEL END

	/** メール表示用キー 工事進捗確認 */
	private static final String ML_URL_KOJI = "FU_BAT_ML_URL_KOJI";

	// IT1-2013-0000254 Otsuka 2013/01/22 end

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		/**
		 *  Postfixパラメータの読込
		 */
		// 共通パラメータからメールヘッダーリストを取得
		String[] argList = (String[])super.commonItem.getObject("ARG_LIST");

		HashMap headMap = JFUBatCommon.getMailHeaderPostFix(argList);
		String strFrom = (String)headMap.get("From"); // 受信メール送信元
		String strResDtm = (String)headMap.get("Date"); // 受信日時

		if (strResDtm != null)
		{
			try
			{
				// 日付書式変換("EEE, d MMM yyyy HH:mm:ss Z"→"yyyyMMddHHmmssZ")
				SimpleDateFormat date = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US);
				Date now = date.parse(strResDtm.trim());
				date.applyPattern("yyyyMMddHHmmssSSS");
				strResDtm = date.format(now);

			}
			catch (ParseException pe)
			{
				// ParseException発生の場合は書式指定なしで書式変換する。(以降のExceptionはFWへ通知)
				SimpleDateFormat date = new SimpleDateFormat();
				Date now = date.parse(strResDtm.trim());
				date.applyPattern("yyyyMMddHHmmssSSS");
				strResDtm = date.format(now);
			}
		}
		else
		{
			// メールヘッダ情報が設定されていない場合はシステムエラー
			super.logPrint.printBusinessErrorLog(EFUB0170KE, new String[] { "ARG_LIST.Date" });
			commonItem.addErrorCount(1);
			throw new JBSbatBusinessError();
		}

		//受信メール送信元の取得
		if (strFrom != null)
		{
			// 下記の形式の場合の取得を行う。
			// " <受信メール送信元>" or " 受信メール送信元" or " 不要な文字列 <受信メール送信元>" ⇒ "受信メール送信元"

			strFrom = Pattern.compile("(.+|^)<|>(.+|$)").matcher(strFrom).replaceAll(JFUStrConst.EMPTY).trim();

			if (strFrom.indexOf(" ") > 1)
			{
				// 下記の形式の場合の取得を行う。
				// " 不要な文字列 受信メール送信元" or " 不要な文字列 受信メール送信元 不要な文字列" ⇒ "受信メール送信元"

				String[] mailArray = strFrom.split(" ");
				if (mailArray.length > 1)
				{
					for (int j = 0; j < mailArray.length; j++)
					{
						if (mailArray[j].indexOf("@") > -1)
						{
							strFrom = mailArray[j];
							break;
						}
					}
				}
				else
				{
					strFrom = mailArray[0];
				}
			}

			if (strFrom.indexOf("@") == -1)
			{
				// メールヘッダ情報が不正な場合はシステムエラー
				super.logPrint.printBusinessErrorLog(EFUB0170KE, new String[] { "ARG_LIST.From" });
				commonItem.addErrorCount(1);
				throw new JBSbatBusinessError();
			}
		}
		else
		{
			// メールヘッダ情報が設定されていない場合はシステムエラー
			super.logPrint.printBusinessErrorLog(EFUB0170KE, new String[] { "ARG_LIST.From" });
			commonItem.addErrorCount(1);
			throw new JBSbatBusinessError();
		}

		// プロパティファイルよりドメイン一覧を取得
		String strDomainPrp = JFUBatCommon.getApplicationConst(JFUStrConst.FU_MOBILE_DOMAIN);
		if (!JFUBatCommon.isNotNullCheck(strDomainPrp))
		{
			// プロパティ設定値がない場合エラー
			throw new JBSbatBusinessException(EFUB0150KE, new String[] { JFUStrConst.FU_MOBILE_DOMAIN });
		}
		String[] domainList = strDomainPrp.split(JFUStrConst.S_SEP_CAM);

		// PCドメイン,携帯ドメイン区分(1:PC(初期値),2:携帯)
		String domKbn = "1";

		for (int i = 0; i < domainList.length; i++)
		{
			String strDomain = domainList[i];
			// プロパティドメインに一致した場合、ドメイン判定フラグを2:携帯へ設定(後方一致)
			if (strFrom.endsWith(strDomain))
			{
				domKbn = "2";
				break;
			}
		}

		// メール本文設定用有効期限算出
		String strYukuKign = JFUBatCommon.getApplicationConst(JFUStrConst.FU_MAIL_YKKIGEN);
		if (!JFUBatCommon.isNotNullCheck(strDomainPrp))
		{
			// プロパティ設定値がない場合エラー
			throw new JBSbatBusinessException(EFUB0150KE, new String[] { JFUStrConst.FU_MAIL_YKKIGEN });
		}

		strYukuKign = JFUBatCommon.addDay(JFUBatCommon.getSysDate(), Integer.parseInt(JFUBatCommon.getApplicationConst(JFUStrConst.FU_MAIL_YKKIGEN)));

		// 有効期限設定
		StringBuffer sbYukuKign = new StringBuffer();
		sbYukuKign.append(strYukuKign.substring(0, 4));
		sbYukuKign.append(strYukuKign.substring(4, 6));
		sbYukuKign.append(strYukuKign.substring(6, 8));

		String strUrl = JFUBatCommon.getApplicationConst(JFUStrConst.FU_MAIL_URL);
		if (!JFUBatCommon.isNotNullCheck(strDomainPrp))
		{
			// プロパティ設定値がない場合エラー
			throw new JBSbatBusinessException(EFUB0150KE, new String[] { JFUStrConst.FU_MAIL_URL });
		}

		// ●工事進捗確認用Webアクセス認証キー登録
		// ユースケースIDを格納するMAP
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		//ユースケースIDを設定
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, SERVICE_ID_FUSV0222);

		// サービスに渡す業務データを格納するMAP
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		// サービスの処理結果が格納されるMAP
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		/**
		 *  パラメータ格納MAP
		 *  サービスのインターフェース定義の内容をパラメータとして渡す。
		 */
		// 工事進捗Webアクセス認証キー登録SCのパラメータを設定
		HashMap<String, Object> mapSc1 = new HashMap<String, Object>();
		mapSc1.put("func_code", "1");
		mapSc1.put("sends_mlad", strFrom);
		mapSc1.put("yk_kigen_ymd", sbYukuKign);
		mapSc1.put("mail_rcv_dtm", strResDtm);
		mapSc1.put("domainkbn", domKbn);

		// SC名のマップとして格納する。
		inputMap.put(SC_NAME_FUSV0222, mapSc1);

		/**
		 *  サービス呼出(工事進捗確認用Webアクセス認証キー登録)
		 */
		try
		{
			JFUBatCommon.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		}
		catch (JCCbatFrameworkException je)
		{
			super.logPrint.printBusinessErrorLog(EFUB0180KE, new String[] { "メール自動返信" });
			commonItem.addErrorCount(1);
			throw new JBSbatBusinessError();
		}
		catch (Throwable je)
		{
			super.logPrint.printBusinessErrorLog(EFUB0180KE, new String[] { "メール自動返信" });
			commonItem.addErrorCount(1);
			throw new JBSbatBusinessError();
		}

		/**
		 *  サービスの処理結果を取得(携帯の場合のみ)
		 */
		if ("2".equals(domKbn))
		{
			String accsKeyScResult = (String)outputMap.get("RETURN_CODE");
			// 工事進捗確認用Webアクセス認証キー登録SC結果がエラーの場合、警告終了。
			if (!SC_RESULT_ERR_0.equals(accsKeyScResult))
			{
				super.logPrint.printBusinessErrorLog(EFUB0190KE, new String[] { accsKeyScResult });
			}
		}

		// ●メール送信登録
		// 先行SC実行結果マップ
		HashMap childOutputMap = (HashMap)outputMap.get(SC_NAME_FUSV0222);

		// メールコード(初期値:PC)
		String mailCd = "FUM1000019";

		// 携帯
		if ("2".equals(domKbn))
		{
			mailCd = "FUM1000020";
		}

		// ユースケースIDを格納するMAP
		paramMap = new HashMap<String, Object>();
		//ユースケースIDを設定
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, SERVICE_ID_FUSV0278);

		// サービスに渡す業務データを格納するMAP
		inputMap = new HashMap<String, Object>();

		// ◆送信先一覧明細
		ArrayList list1 = new ArrayList();
		HashMap list1Map = new HashMap();

		list1Map.put("mlad", strFrom);
		list1Map.put("mlad_set_field_cd", JFUStrConst.CD00788_01);
		list1.add(list1Map);

		// ◆非定型文字列一覧明細
		ArrayList list2 = new ArrayList();

		// 工事進捗確認
		String urlKoji = JFUBatCommon.getApplicationConst(ML_URL_KOJI);
// ANK-3057-00-00 DEL START
//		// Webからのお問い合わせ
//		String urlWeb = JFUBatCommon.getApplicationConst(ML_URL_WEB);
// ANK-3057-00-00 DEL END

		// PCの場合
		if ("1".equals(domKbn))
		{
			HashMap list2Map1 = new HashMap();
// ANK-3057-00-00 DEL START
//			HashMap list2Map2 = new HashMap();
// ANK-3057-00-00 DEL END
			// [0]：工事進捗確認
			list2Map1.put("text_htk_ckam_moji", urlKoji);
// ANK-3057-00-00 DEL START
//			// [1]：Webからのお問い合わせ
//			list2Map2.put("text_htk_ckam_moji", urlWeb);
// ANK-3057-00-00 DEL END

			list2.add(list2Map1);
// ANK-3057-00-00 DEL START
//			list2.add(list2Map2);
// ANK-3057-00-00 DEL END
		}
		else
		{
			HashMap list2Map1 = new HashMap();
			HashMap list2Map2 = new HashMap();
// ANK-3057-00-00 DEL START
//			HashMap list2Map3 = new HashMap();
// ANK-3057-00-00 DEL END

// ANK-3057-00-00 MOD START
//			// [0]：有効期限年月日(YYYY/MM/DD)
//			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//
//			Date formatDate = sdf.parse(sbYukuKign.toString());
//			sdf.applyPattern("yyyy/MM/dd");
//
//			list2Map1.put("text_htk_ckam_moji", sdf.format(formatDate));
//
//			// [1]：インターフェース定義.URL + FUSV022201SC.Webアクセス認証キー
//			list2Map2.put("text_htk_ckam_moji", strUrl + (String)childOutputMap.get("kjsc_cfm_webank"));
//
//			// [2]：Webからのお問い合わせ
//			list2Map3.put("text_htk_ckam_moji", urlWeb);
			// [0]：インターフェース定義.URL + FUSV022201SC.Webアクセス認証キー
			list2Map1.put("text_htk_ckam_moji", strUrl + (String)childOutputMap.get("kjsc_cfm_webank"));

			// [1]：有効期限年月日(YYYY/MM/DD)
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
			Date formatDate = sdf.parse(sbYukuKign.toString());
			sdf.applyPattern("yyyy/MM/dd");
			list2Map2.put("text_htk_ckam_moji", sdf.format(formatDate));
// ANK-3057-00-00 MOD END

			list2.add(list2Map1);
			list2.add(list2Map2);
// ANK-3057-00-00 DEL START
//			list2.add(list2Map3);
// ANK-3057-00-00 DEL END
		}



		HashMap<String, Object> childMap = new HashMap<String, Object>();

		// 機能コード
		childMap.put("func_code", "1");
		// メールコード
		childMap.put("mail_cd", mailCd);
		// メール送信パターンコード
		childMap.put("mail_send_pattern_cd", JFUStrConst.CD00789_01);

		String strSendmMlad = JFUBatCommon.getApplicationConst(JFUStrConst.FU_AUTOMAILSEND_MLAD_FR);
		childMap.put("sendm_mlad", strSendmMlad);

		childMap.put("ECC0021D010CBSMsg1List", list1);
		childMap.put("ECC0021D010CBSMsg2List", list2);
		childMap.put("ECC0021D010CBSMsg3List", new ArrayList());
		childMap.put("ECC0021D010CBSMsg4List", new ArrayList());
		childMap.put("ECC0021D010CBSMsg5List", new ArrayList());

		childMap.put("domainkbn", domKbn);
		childMap.put("url", strUrl);

		// SC名のマップとして格納する。
		inputMap.put(SC_NAME_FUSV0278, childMap);

		// サービスの処理結果が格納されるMAP
		outputMap = new HashMap<String, Object>();

		/**
		 *  サービス呼出(メール送信情報登録)
		 */
		try
		{
			JFUBatCommon.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		}
		catch (JCCbatFrameworkException je)
		{
			super.logPrint.printBusinessErrorLog(EFUB0180KE, new String[] { "メール自動返信" });
			commonItem.addErrorCount(1);
			throw new JBSbatBusinessError();
		}
		catch (Throwable je)
		{
			super.logPrint.printBusinessErrorLog(EFUB0180KE, new String[] { "メール自動返信" });
			commonItem.addErrorCount(1);
			throw new JBSbatBusinessError();
		}

		// メール送信情報登録SCの処理結果を取得
		HashMap resultMapSc02 = (HashMap)outputMap.get(SC_NAME_FUSV0278);
		String mailScResult = (String)resultMapSc02.get("mail_send_err_flg");

		// メール送信情報登録SCのメール送信結果がエラーの場合、警告終了。
		if (SC_RESULT_ERR_1.equals(mailScResult))
		{
			super.logPrint.printBusinessErrorLog(EFUB0160JW, new String[] { (String)resultMapSc02.get("mail_send_no") });
		}

		// 登録件数ログを出力
		super.logPrint.printBusinessErrorLog(EFUB0060AI, new String[] { "FU_T_KJSC_CFM_WEBANK", "1" });
		// メール送信件数
		super.logPrint.printBusinessErrorLog(EFUB0200AI, new String[] { (String)resultMapSc02.get("mail_title"), "1",
				(String)resultMapSc02.get("mail_send_no") });

		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

}
