/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKEoTokeiChrgFileSend
*	ソースファイル名	：JBSbatKKEoTokeiChrgFileSend.java
*	作成者				：富士通　
*	作成日				：2012年07月05日
*＜機能概要＞
*　eo光統計情報ファイル（課金契約ベース）送信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/07/05   FJ)団		新規作成
*	v3.01.00	2012/08/29   FJ)藤本		【ST1-2012-0000404】障害対応
*	v3.02.00	2012/11/23   FJ)柳		【TAI-2012-0000095】対応
*	v4.00.00	2013/02/15   FJ)柳		【ST1-2013-0000354】対応
*	v4.01.00	2013/03/15	 FJ)柳		【IT1-2013-0000498】対応
*	v49.00.00	2020/05/30  FJ)Eric		ANK-3807-00-00
*	v74.00.00	2024/12/02	 FJ)井上	 ANK-4592-00-00   テレビ新コース（スカパー用）導入対応
*********************************************************************/
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 eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatDenshiFileUtil;
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.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKEoTokeiChrgFileSend extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** エンコード */
	private static final String ENCODE = "Shift-JIS";

	/** ファイルID(ｅｏ光統計情報データ件数ファイル（ネット・テレビ）) */
	private static final String FILE_ID_KKIFM224 = "KKIFM224002.csv";

	/** ファイルID(ｅｏ光統計情報データ件数ファイル（テレビ単独）) */
	private static final String FILE_ID_KKIFM225 = "KKIFM225002.csv";

	// ANK-4592-00-00 ADD START
	/** ファイルID(ｅｏ光統計情報データ件数ファイル（ネット・テレビ(CSコース)）) */
	private static final String FILE_ID_KKIFM224_cs = "KKIFM224003.csv";

	/** ファイルID(ｅｏ光統計情報データ件数ファイル（テレビ単独(CSコース)）) */
	private static final String FILE_ID_KKIFM225_cs = "KKIFM225003.csv";
	// ANK-4592-00-00 ADD END

	/** ｅｏ光統計情報データ件数ファイル（ネット・テレビ） */
	private static int data_cunt_kkifm224 = 0;

	/** ｅｏ光統計情報データ件数ファイル（テレビ単独） */
	private static int data_cunt_kkifm225 = 0;

	// ANK-4592-00-00 ADD START
	/** ｅｏ光統計情報データ件数ファイル（ネット・テレビ(CSコース)） */
	private static int data_cunt_kkifm224_cs = 0;

	/** ｅｏ光統計情報データ件数ファイル（テレビ単独(CSコース)） */
	private static int data_cunt_kkifm225_cs = 0;
	// ANK-4592-00-00 ADD END
	
	/** データ部の件数 */
	private static int data_cunt = 0;
	
	/** エラーメッセージ(置換え文字列：%2%) */
	private static final String MASSEAGE = "ファイル出力";
		
	/** ファイルID */
	private static final String FILE_ID = "KKIFE133";
	
	/** FREE項目保持 */
	private String[] filePath = null;

	/** FREE項目保持 */
	private String data_list = 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";
	
	private static final String FILENAME = "eo光テレビ統計情報ファイル（課金）（%1$s）_%2$s.csv";
	
	
	// ANK-3807-00-00 ADD END
	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		filePath = commonItem.getFreeItem().split(";", -1);
		
		data_cunt_kkifm224 = new Integer(this.getInputFile(filePath[0] + FILE_ID_KKIFM224)).intValue();
		data_cunt_kkifm225 = new Integer(this.getInputFile(filePath[0] + FILE_ID_KKIFM225)).intValue();
		//ANK 4592-00-00 ADD START
		data_cunt_kkifm224_cs = new Integer(this.getInputFile(filePath[0] + FILE_ID_KKIFM224_cs)).intValue();
		data_cunt_kkifm225_cs = new Integer(this.getInputFile(filePath[0] + FILE_ID_KKIFM225_cs)).intValue();
		//ANK 4592-00-00 ADD END
		//ANK-4592-00-00 MOD START
		data_cunt = data_cunt_kkifm224 + data_cunt_kkifm225 + data_cunt_kkifm224_cs + data_cunt_kkifm225_cs;
		//ANK-4592-00-00 MOD END
		
		
		//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");
		// ｅｏ光テレビ統計情報読込み
		data_list = this.getInputFileData(filePath[4]);
		super.logPrint.printDebugLog("execute_END");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// システム日時の取得
		String sysDate = JBSbatDateUtil.getSystemDateTime();
		
		// バッチ運用日の前月の年月を保持
		String month = JBSbatDateUtil.adjustMonth(super.opeDate, -1);
		
		String filePath_data = filePath[1] + "(" + month.substring(0, 6) + ")" + "_" + sysDate + ".csv";
		String filePath_cnt  = filePath[2] + "(" + month.substring(0, 6) + ")" + "_" + sysDate + ".cnt";
		String filePath_flg  = filePath[3] + "(" + month.substring(0, 6) + ")" + "_" + sysDate + ".flg";
		
		// ｅｏ光テレビ統計情報ファイル（課金契約ベース）データファイルの出力
		executeOutputFile(data_list, filePath_data, true, false);
		
		// ANK-3807-00-00 DEL START
		// ｅｏ光テレビ統計情報ファイル（課金契約ベース）件数ファイルの出力
		//executeOutputFile(String.valueOf(data_cunt), filePath_cnt, true, true);
		// ANK-3807-00-00 DEL END
		
		// ANK-3807-00-00 ADD START
		String delYmd = JPCDateUtil.addMonth(opeDate, 1);
		
		addEfileKanriDlFileKanri(data_cunt, FILE_CD, filePath_data, delYmd, String.format(FILENAME, month.substring(0,6), sysDate));
		
		// ANK-3807-00-00 ADD END
		
		
		// ANK-3807-00-00 DEL START
		// ｅｏ光テレビ統計情報ファイル（課金契約ベース）フラグファイルの出力
		//executeOutputFile(null, filePath_flg, false, false);
		
		// ｅｏ光テレビ統計情報ファイル（課金契約ベース）データファイル
		//executeFtp(filePath_data);

		// ｅｏ光テレビ統計情報ファイル（課金契約ベース）件数ファイル
		//executeFtp(filePath_cnt);
		
		// ｅｏ光テレビ統計情報ファイル（課金契約ベース）フラグファイル
		//executeFtp(filePath_flg);
		// ANK-3807-00-00 DEL END
		
		
		// ANK-3807-00-00 ADD START
		db_ZM_T_DL_FILE_KANRI.close();
		// ANK-3807-00-00 ADD END
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * データ件数ファイル情報を読み込みます。<br>
	 * <p>
	 * @param file_name ファイル名(フルパス)
	 * @param ｅｏ光統計情報データ件数ファイル（ネット・テレビ）
	 *         ｅｏ光統計情報データ件数ファイル（テレビ単独）
	 * 
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	private String getInputFile(String file_name) throws JBSbatBusinessException, IOException
	{
		BufferedReader br = null;
		
		// 件数ファイルを読み込みます。
		try
		{
			InputStreamReader is = new InputStreamReader(new FileInputStream(file_name), ENCODE);
			br = new BufferedReader(is);
			
			while (br.ready())
			{
				// 1行読込み（ダブルクォートを外す）
				return br.readLine().toString().replaceAll("\"", "");
			}
		}
		catch (IOException e)
		{
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{file_name});
		}
		finally
		{
			if (null != br)
			{
				br.close();
			}
		}
		
		super.logPrint.printDebugLog("getInputFile_END");
		
		return "0";
	}

	/**
	 * 外部IFファイルを出力します。<br>
	 * <p>
	 * @param file_data 出力情報
	 * @param file_path ファイル名(フルパス)
	 * @param fileKind 出力ファイルの種類（true:データ、カウントファイル　false:フラグファイル）
	 * @param isCount カウントファイルかどうかの判定（true:カウントファイル　false:データファイル）
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	private void executeOutputFile(String file_data, String file_path, boolean fileKind, boolean isCount) throws IOException, JBSbatBusinessException
	{
		
		// 一時ファイル読込み処理
		BufferedWriter wr = null;
		try
		{
			// パラメータで渡された中間ファイルを出力する。
			wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file_path), ENCODE));
			
			if(fileKind)
			{
				// カウントファイルの場合、ダブルクォート、改行を設定
				if(isCount)
				{
					wr.write("\"" + file_data + "\"");
					wr.write("\r\n");
				}
				else
				{
					// データ件数の出力
					wr.write(file_data);
				}
			}
			wr.flush();
		}
		catch(IOException e)
		{
			throw new JBSbatBusinessException("EKKB0250CE", new String[]{file_path, MASSEAGE});
		}
		finally
		{
			if (null != wr)
			{
				wr.close();
			}
		}
	}

	/**
	 * Ftp連携部品を使用してファイル送信を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.ファイルパスが空の場合、エラーとします。<br>
	 * 
	 * 2.連携部品の引数を作成します。<br>
	 * 
	 * 3.Ftp連携部品を実行します。<br>
	 * 
	 * 4.処理結果が正常以外の場合、エラーを発生させます。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param value　転送対象ファイルパス。
	 * @param if_id　インターフェースID。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	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});
		}
	}

	/**
	 * データ抽出ファイルを読み込みます。<br>
	 * <p>
	 * @param file_name ファイル名(フルパス)
	 * @param ｅｏ光テレビ統計情報（課金）抽出ファイル
	 * 
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	private String getInputFileData(String file_name) throws JBSbatBusinessException, IOException
	{
		super.logPrint.printDebugLog("getInputFileData_START");
		super.logPrint.printDebugLog(":::::ファイルパス::::::" + file_name);	
		
		// ｅｏ光テレビ統計情報保持用
		StringBuffer data = new StringBuffer();
		
		BufferedReader br = null;
		
		// 件数ファイルを読み込みます。
		try
		{
			InputStreamReader is = new InputStreamReader(new FileInputStream(file_name), ENCODE);
			br = new BufferedReader(is);
			
			while (br.ready())
			{
				// 1行読込み
				data.append(br.readLine());
				data.append("\r\n");
			}
		}
		catch (IOException e)
		{
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{file_name});
		}
		finally
		{
			if (null != br)
			{
				br.close();
			}
		}
		
		super.logPrint.printDebugLog("getInputFile_END");

		return data.toString();
	}
	
	
	// 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_219								// 処理管理番号
				, 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
}
