/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKKnTvGuidemgSaiSaksei
*	ソースファイル名	：JBSbatKKKnTvGuidemgSaiSaksei.java
*	作成者				：FJ)古田
*	作成日				：2011年10月19日
*＜機能概要＞
*　ＫＮテレビジョンガイド誌差分作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/19  FJ)古田		新規作成
*	v3.00.00	2012/08/03	FJ)倉上		【ST1-2012-0000162】障害対応
*	v3.01.00	2012/08/25	FJ)倉上		【ST1-2012-0000394】障害対応
*	v3.04.00	2012/09/24	FJ)倉上		【ST1-2012-0000622】障害対応
*	v3.05.00	2012/10/02	FJ)藤本		【ST1-2012-0000674】障害対応
*	v3.06.00	2012/10/11	FJ)藤本		【ST1-2012-0000707】障害対応
*	v3.07.00	2012/10/14	FJ)倉上		【ST1-2012-0000726】障害対応
*	v3.08.00	2012/10/16	FJ)藤本		【ST1-2012-0000726】障害対応
*	v5.00.00	2013/01/24	FJ)石原		【ANK-1371-00-00】ガイド送付リストの編集対応
*	v49.00.00	2020/05/30  FJ)Eric		ANK-3807-00-00
*	v50.00.00	2020/08/30  FJ)星野		OM-2020-0001141
**********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatDenshiFileUtil;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFE055001;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCDateUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKKnTvGuidemgSaiSaksei extends JBSbatBusinessService
{
	/** 外部インターフェイスID（KNテレビジョンガイド誌（差分）ファイル）*/
	private static final String FILE_ID = "KKIFE055";

	/** データファイル名 */
	private static final String FILENAME_DATA = "KNTVGUIDE_SABUN.csv";
	
	/** 件数ファイル名 */
	private static final String FILENAME_COUNT = "KNTVGUIDE_SABUN.cnt";
	
	/** フラグファイル名 */
	private static final String FILENAME_FLG = "KNTVGUIDE_SABUN.flg";
	
	/** ファイル名１（１８日作成ファイル）*/
	private static final String FILENAME1 = "KNTVGUIDE.csv";
	
	/** ファイル名２（２２日作成ファイル）*/
	private static final String FILENAME2 = "KNTVGUIDE_2.csv";
	// ANK-3807-00-00 ADD START
	private static final String FILENAME3 = "KNテレビジョンガイド誌ファイル（差分）_%s.csv";
	// ANK-3807-00-00 ADD END
	
	/** 終了年月日 */
	private static final String LAST_YEAR = "20991231";
	
	/** ファイル文字列の分割文字*/
	private static final String SPLIT_MOJI = "\",\"";
	
	/** 該当データカウント */
	private int count = 0;
	
	/** バッチ運用日の翌月 */
	private String opDateYm = "";
	
	/** パラメータ保持 */
	private String[] free = null;
	
	
	// ANK-3807-00-00 ADD START
	/** DBアクセスクラス(ダウンロードファイル管理) */
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	private static final String TBL_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	
	/** SQL定義キー(ダウンロードファイル管理　INSERT_002) */
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_002 = "KK_INSERT_002";
	
	private static final String FILE_CD = "0000";
	
	// ANK-3807-00-00 ADD END
	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// フリー項目よりファイルの出力先を取得する。
		free = super.commonItem.getFreeItem().split(";", -1);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		//ANK 3807-00-00 ADD START
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, TBL_ZM_T_DL_FILE_KANRI);
		//ANK 3807-00-00 ADD END
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 入力出力先フォルダパス
		free = super.commonItem.getFreeItem().split(";");
		
		// １８日作成ファイルを読込Listに格納します。
		List<String> file1List = getFile1List(free[0]);
		BufferedReader in_reader = null;
		
		if (0 != file1List.size())
		{
			try
			{
				// ＫＮテレビジョンガイド誌Listファイル送信データ2（２２日に作成されたファイル）
				in_reader = new BufferedReader(new InputStreamReader(new FileInputStream(free[0] + getFileName(FILENAME2)), JKKBatConst.SJIS));
				
				// ヘッダーが設定されている場合(データが0件ではない場合)
				if(in_reader.ready())
				{
					// ヘッダーを取得
					String[] headerStr = getSplitData(in_reader.readLine());
					
					// ヘッダーをセット
					outputBean.addOutMapList(createKkife055(headerStr));
				}
				
				String[] spltData = null;
				
				while (in_reader.ready())
				{
					String data = in_reader.readLine();
					spltData = data.split(",");
					
					// 顧客状態の取得
					String custStat = spltData[12];
					// コードの取得
					String cd = spltData[13];
					// 確認Key
					String kakuninKey = custStat + cd;
					
					super.logPrint.printDebugLog("■kakuninKey:::" + kakuninKey.replaceAll("\"", ""));
					
					// １８日のファイルの存在していない場合ファイルに出力します。
					if(!file1List.contains((kakuninKey.replaceAll("\"", ""))))
					{
						// 差分ファイル出力
						outputBean.addOutMapList(createKkife055(spltData));
						
						// 件数をカウントアップ
						count++;
					}
				}
				
				// データ件数が0件の場合、設定したヘッダ行を削除します。
				if(0 == count)
				{
					outputBean.clearOutMapList();
				}
				
			}
			catch (IOException e)
			{
				super.logPrint.printDebugLog("有料番組ガイド申込者配布分List（差分）ファイルなし。");
			}
			finally
			{
				if(in_reader != null)
				{
					in_reader.close();
				}
			}
		}
		
		// 翌月を取得
		opDateYm = JBSbatInterface.adjustMonth(super.opeDate, 1).substring(0, 6);
		
		super.logPrint.printDebugLog("翌月を取得:::::" + opDateYm);
		
		// ファイル(外部ファイル)を出力します。
		JKKBatCommon.outFile(super.commonItem, outputBean, "KKIFE055001", free[0], opDateYm + FILENAME_DATA);
		
		// ファイル(中間ファイル)を出力します。
		JKKBatCommon.outFile(super.commonItem, outputBean, "KKIFE055001", free[1], opDateYm + FILENAME_DATA);
		
		
		// ANK-3807-00-00 ADD START
		String delYmd = JPCDateUtil.addMonth(opeDate, 1);
		
		String filePathInput = free[1].concat(opDateYm).concat(FILENAME_DATA);
		
// OM-2020-0001141対応 20200830 星野 MOD START
//		addEfileKanriDlFileKanri(count, FILE_CD, filePathInput, delYmd, String
//				.format(FILENAME3, opeDate.substring(0, 6)));
		addEfileKanriDlFileKanri(count, FILE_CD, filePathInput, delYmd, String
				.format(FILENAME3, opDateYm));
// OM-2020-0001141対応 20200830 星野 MOD END
		
		// ANK-3807-00-00 ADD END
		
		
		// ANK-3807-00-00 DEL START
		// ＫＮテレビジョンガイド誌差分ファイル送信件数ファイル出力
		//this.createFile(free[1] + getFileName(FILENAME_COUNT), true);
		
		// ＫＮテレビジョンガイド誌差分ファイル送信フラグファイル出力
		//this.createFile(free[1] + getFileName(FILENAME_FLG), false);
		
		// KNテレビジョンガイド誌（差分）ファイル送信データファイル出力
		//executeFtp(free[1] + getFileName(FILENAME_DATA));
		
		// KNテレビジョンガイド誌（差分）ファイル送信件数ファイル出力
		//executeFtp(free[1] + getFileName(FILENAME_COUNT));
		
		// KNテレビジョンガイド誌（差分）ファイル送信フラグファイル出力
		//executeFtp(free[1] + getFileName(FILENAME_FLG));
		
		super.logPrint.printDebugLog("execute_END");
		return null;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		
		//ANK-3807-00-00 ADD START
		db_ZM_T_DL_FILE_KANRI.close();
		//ANK-3807-00-00 ADD END
		
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 
	 *  KNテレビジョンガイド誌（差分）ファイル送信の作成を行います。
	 * @param tranMap トランデータ
	 * @return JBSbatServiceInterfaceMap
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap createKkife055(String[] spltData) throws Exception
	{
		// 入出力インターフェースオブジェクトを生成
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		
		outmap.setString(JBSbatKKIFE055001.PCD, JBSbatInterface.charConverter(spltData[0].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.AD_1, JBSbatInterface.charConverter(spltData[1].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.AD_2, JBSbatInterface.charConverter(spltData[2].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.CHO, JBSbatInterface.charConverter(spltData[3].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.BNCHI, JBSbatInterface.charConverter(spltData[4].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.GOU, JBSbatInterface.charConverter(spltData[5].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.TOU, JBSbatInterface.charConverter(spltData[6].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.ADRRM, JBSbatInterface.charConverter(spltData[7].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.SHUGJ_NM, JBSbatInterface.charConverter(spltData[8].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.KANJI_NM_1, JBSbatInterface.charConverter(spltData[9].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.KANJI_NM_2, JBSbatInterface.charConverter(spltData[10].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.KISHO, JBSbatInterface.charConverter(spltData[11].replaceAll("\"", "")));
		outmap.setString(JBSbatKKIFE055001.CUST_STAT, spltData[12].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.CD, spltData[13].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.GUIDE_HASSO_CNT, spltData[14].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.GUIDE_SBT, spltData[15].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.HASSO_WAY, spltData[16].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.TEL, spltData[17].replaceAll("\"", ""));

		// 「オプションサービス契約」のサービス終了年月日が設定されている場合
		if(spltData[18].replaceAll("\"", "") != null && !"".equals(spltData[18].replaceAll("\"", "")))
		{
			// 「オプションサービス契約」のサービス終了年月日に「20991231」が設定されている場合
			if(LAST_YEAR.equals(spltData[18].replaceAll("\"", "")))
			{
				// 「オプションサービス契約」のサービス終了年月日
				outmap.setString(JBSbatKKIFE055001.GUIDE_SOHU_ENDYMD, "");
			}
			else
			{
				// 「オプションサービス契約」のサービス終了年月日を設定
				outmap.setString(JBSbatKKIFE055001.GUIDE_SOHU_ENDYMD, spltData[18].replaceAll("\"", ""));
			}
		}
		
		outmap.setString(JBSbatKKIFE055001.CKI_FLG, spltData[19].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.CHIRASHI_SOFU_FLG, spltData[20].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.YOBI_FLG_1, spltData[21].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.YOBI_FLG_2, spltData[22].replaceAll("\"", ""));
		outmap.setString(JBSbatKKIFE055001.YOBI_FLG_3, spltData[23].replaceAll("\"", ""));

		outmap.setOutFlg(true);
		
		return outmap;
	}
	
	/**
	 * 出力ファイル名を取得します。
	 * @param  fileNm ファイル名
	 * @return String 指定のファイル名
	 * @throws Exception 例外
	 */
	private String getFileName(String fileNm) throws Exception
	{
		// 翌月を取得
		opDateYm = JBSbatInterface.adjustMonth(super.opeDate, 1).substring(0, 6);

		return opDateYm + fileNm;
	}
	
	/**
	 * ＫＮテレビジョンガイド誌Listファイル送信
	 * １８日作成分を格納したMapを取得します。<br>
	 * 
	 * @param path KNTVGUIDEファイルが格納されているパス
	 * @return １８日のレコードが格納されたList
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private List<String> getFile1List(String path) throws Exception
	{
		// 有料番組ガイド申込者情報保持(１８日作成分)
		List<String> retList = new ArrayList<String>();
 
		BufferedReader in_reader = null;

		try
		{
			// ＫＮテレビジョンガイド誌Listファイル送信データ
			in_reader = new BufferedReader(new InputStreamReader(new FileInputStream(path + getFileName(FILENAME1)), JKKBatConst.SJIS));

			// ヘッダーを読み飛ばします。
			in_reader.readLine();

			String[] spltData = null;

			while (in_reader.ready())
			{
				spltData = getSplitData(in_reader.readLine());
				
				// 顧客状態の取得
				String custStat = spltData[12];
				// コードの取得
				String cd = spltData[13];
				// 確認Key
				String kakuninKey = custStat + cd;
				
				retList.add(kakuninKey);
			}
		}
		catch (IOException e)
		{
			return null;
		}
		finally
		{
			if(in_reader != null)
			{
				in_reader.close();
			}
		}

		return retList;
	}

	/**
	 * 
	 * 読み込んだ１行のファイルを分割します。<br>
	 * @param line
	 * @return 分割後のFile
	 * @throws Exception
	 */
	private String[] getSplitData(String line) throws Exception
	{

		return line.substring(1, line.length() - 1).split(SPLIT_MOJI);
	}
	
	/**
	 * 指定されたファイルを出力します。<br>
	 * <p>
	 * @param file_name ファイル名(フルパス)
	 * @param isCntFile ファイル作成フラグ(true：件数ファイル　false：フラグファイル)
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void createFile(String file_name, boolean isCntFile) throws IOException, JBSbatBusinessException
	{
		// 一時ファイル読込み処理
		BufferedWriter wr = null;
		try
		{
			// ファイルの生成(SJIS)
			wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file_name), JKKBatConst.SJIS));
			
			// 件数ファイルを作成する場合は件数を設定する。
			if(isCntFile)
			{
				// 件数を""(ダブルクォート)で囲み、改行する。
				wr.write("\"" + count + "\"");
				wr.write("\n");
			}
			
			// ファイル出力
			wr.flush();
		}
		catch(IOException e)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0250CE, new String[]{file_name, e.getMessage()});
		}
		finally
		{
			if (wr != null)
			{
				wr.close();
			}
		}
	}
	
	/**
	 * Ftp連携部品を使用してファイル送信を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.ファイルパスが空の場合、エラーとします。<br>
	 * 
	 * 2.連携部品の引数を作成します。<br>
	 * 
	 * 3.Ftp連携部品を実行します。<br>
	 * 
	 * 4.処理結果が正常以外の場合、エラーを発生させます。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param value　転送対象ファイルパス。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeFtp(String value) throws Exception
	{
		ArrayList<String> file_list = new ArrayList<String>(1);
		HashMap<String, Object> out_map = new HashMap<String, Object>(3);

		file_list.add(value);

		// 転送処理を実行します
		boolean result = JCCBatCommon.putFTP(super.commonItem, file_list, FILE_ID, JCCBatCommon.ISI, out_map);

		// エラー判定をします
		if (!result)
		{
			String kbn = out_map.get("ERR_KBN").toString();
			String err_msg = "";

			// ファイルエラーの場合
			if ("2".equals(kbn))
			{
				err_msg = (String)((HashMap)((ArrayList)out_map.get("FILE_ERR")).get(0)).get("ERR_MESSAGE");
			}
			else
			{
				err_msg = (String)((HashMap)out_map.get("CONNECT_ERR")).get("ERR_MESSAGE");
			}

			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0200CE, new String[]{value, err_msg});
		}
	}
	
	
	// ANK-3807-00-00 ADD START
	/**
	 * 電子ファイル管理・ダウンロードファイル管理へ登録します。
	 * <br>
	 * @param dataCnt データ件数
	 * @param fileCd ファイルコード
	 * @param filePath
	 * @param fileDelYmd ファイル削除年月日
	 * @param fileName
	 * @throws Exception 例外が発生した場合
	 */
	private void addEfileKanriDlFileKanri(int dataCnt, String fileCd, String filePath,
			String fileDelYmd, String fileName) throws Exception
	{
		// 電子ファイル管理登録
		String[] ret = JCCbatDenshiFileUtil.createDenshiFile(this.commonItem, fileCd,
				filePath, fileDelYmd);
		
		// ダウンロードファイル管理登録
		String[] paramIns = {
				JKKStrConst.TRAN_KANRI_NO_218								// 処理管理番号
				, fileName												// ダウンロードファイル名
				, String.valueOf(dataCnt)								// データ件数
				, ret[0]												// 電子ファイル管理番号
				, ret[1]												// 世代登録年月日時分秒
		};
		
		executeZM_T_DL_FILE_KANRI_KK_INSERT_002(paramIns);
	}

	/**
	 * SQLKEY(KK_INSERT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *			TRN_KANRI_NO
	 *			FILE_NM
	 *			DATA_CNT
	 *			EFILE_KANRI_NO
	 *			GENE_ADD_DTM
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_DL_FILE_KANRI_KK_INSERT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		
		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_002);
	}
	// ANK-3807-00-00 ADD END
}
