/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom						 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKHisDelToolKktkSvcKei
*	ソースファイル名	：JBSbatKKHisDelToolKktkSvcKei.java
*	作成者				：富士通　
*	作成日				：2014年07月01日
*＜機能概要＞
*　機器提供サービス契約削除部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2014/07/01  FJ)山下		新規作成
*	v9.00.00	2014/08/03  FJ)山下		ST4-2014-0000048 
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;


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;

/**
* 入力ファイルに記述されたキーを元に、物理削除を行います。<BR>
* <BR>
* 物理削除対象テーブル<BR>
* KK0341	機器提供サービス契約	KK_T_KKTK_SVC_KEI
* <BR>
* 入力ファイルとテーブルの対応は以下の通りです。<BR>
* KK0341:KKIFM616011.csv<BR>
* <BR>
* @author 富士通
*/
public class JBSbatKKHisDelToolKktkSvcKei extends JBSbatKKAbstractHistoryDeleteTool
{
	
	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";
	
	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;

	/** キー：機器提供サービス契約番号 */
	private static final String KKTK_SVC_KEI_NO = "KKTK_SVC_KEI_NO";
	/** キー：世代年月日時分秒 */
	private static final String GENE_ADD_DTM = "GENE_ADD_DTM";
	
	/** 入力ファイル項目数 */
	private static final int COL_NUM = 2;
	
	/** 機器提供サービス契約番号桁数 */
	private static final int KKTK_SVC_KEI_NO_LENGTH = 12;
	/** 世代年月日時分秒桁数 */
	private static final int GENE_ADD_DTM_LENGTH = 17;
	
	/** 入力ファイル(KK0341) */
	private static final String DEL_UNLOAD_FILE_KK0341 = "KKIFM616011.csv";
	/** タイムアウト後の入力データを保持するリスト **/
	private ArrayList<String>listTimeOver = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws SQLException 
	 * @throws IOException 
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws IOException, SQLException 
	{
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		// KK0341	機器提供サービス契約	KK_T_KKTK_SVC_KEI
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		
		// 引数チェックに該当した場合
		if (!this.checkFreeItem())
		{
			// 主処理は行わず終了
			this.skip();
			return;
		}
		
		// 引数から起動時間を設定
		setStartUpTime(new Integer(commonItem.getFreeItem()));
		
		// 起動時間を設定
		setStartTimeMills(System.currentTimeMillis());
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception 
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 入力ファイルパスを取得
		String filePath = inMap.getString(INFILE_KEY);
		
		// 入力ファイルチェックに該当した場合
		if (!checkInFile(filePath))
		{
			// 次のファイルへ移行
			return outputBean;
		}
		
		// 入力ファイル
		File inFile = new File(filePath);
		
		BufferedReader br = new BufferedReader(new FileReader(inFile));
		
		// 時間切れフラグ
		boolean isTimeOverFlg = false;
		
		// サポート対象外フラグ
		boolean isUnsupportFileFlg = false;
		
		// 行数
		int lineNumber = 1;
		// 行
		String line;
		//ST4-2014-0000048 ADD START
		// タイムアウト後の入力データを保持するリスト
		listTimeOver = new ArrayList<String>();
		//ST4-2014-0000048 ADD END
		while ((line = br.readLine()) != null)
		{
			
			// 起動時間チェック
			if (isTimeOverFlg || this.isTimeOver())
			{
				//ST4-2014-0000048 MOD START
				// 時間切れフラグを設定し、ループ処理を終了
				isTimeOverFlg = true;
			
//				break;
				listTimeOver.add(line);
				
				continue;
				//ST4-2014-0000048 MOD EMD
			}
			
			// 入力値チェックに該当した場合
			if ( !this.checkParams(line, lineNumber) )
			{
				// 行数繰上げ
				lineNumber++;
				// 次行へ移行
				continue;
			}
			
			// 内容項目取得
			String[] cols = line.replaceAll(DOUBLE_QUOTE, BLANK).split(COMMA);
			// 機器提供サービス契約番号を取得(入力ファイルのN行目)
			String kktkSvcKeiNo = cols[0];
			// 世代年月日時分秒を取得(入力ファイルのN行目)
			String geneAddDtm = cols[1];
		
			// キー情報を生成
			LinkedHashMap<String, String> deleteMap = new LinkedHashMap<String, String>();
			deleteMap.put(KKTK_SVC_KEI_NO, kktkSvcKeiNo);
			deleteMap.put(GENE_ADD_DTM, geneAddDtm);
			
			// KK0341	機器提供サービス契約	KK_T_KKTK_SVC_KEI
			if (DEL_UNLOAD_FILE_KK0341.equals(inFile.getName()))
			{
				int kktkSvcKeiDelCount = this.executeKK_T_KKTK_SVC_KEI_PKDELETE(kktkSvcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_KKTK_SVC_KEI, deleteMap, kktkSvcKeiDelCount, inFile.getName());
			}
			else
			{
				super.logPrint.printDebugLog("サポート対象外のファイルが指定されています。" + inFile.getPath());
				isUnsupportFileFlg = true;
				break;
			}
			
			lineNumber++;
		}
		
		br.close();
		
		// 時間切れの場合
		if (isTimeOverFlg)
		{
			// 引数で指定した起動時間を超えていたら終了
			this.skip();
			this.printTimeOverLog();
		}
		
		// サポート対象外ファイルでない場合
		if (!isUnsupportFileFlg)
		{
			createNewInFile(filePath);
		}
		
		super.logPrint.printDebugLog("execute_END");
		
		return outputBean;
	}

	/**
	 * 業務サービス終了処理
	 * @throws SQLException 
	 */
	public void terminal() throws SQLException 
	{
		
		printTotalDeleteLog();
		
		// DBアクセスクラスをクローズします
		db_KK_T_KKTK_SVC_KEI.close();
	}
	
	/**
	 * 機器提供サービス契約テーブルに対して主キーで物理削除を行います。
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 削除件数
	 * @throws Exception
	 */
	private int executeKK_T_KKTK_SVC_KEI_PKDELETE(String kktkSvcKeiNo, String geneAddDtm) throws Exception 
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		whereMap.setValue(GENE_ADD_DTM, geneAddDtm);

		// DBアクセスを実行します
		return db_KK_T_KKTK_SVC_KEI.deleteByPrimaryKeys(whereMap);
	}

	/**
	 * 入力パラメータのチェックを行います。
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 判定結果
	 */
	private boolean checkParams(String line, int lineNumber)
	{
		String[] cols = line.replaceAll(DOUBLE_QUOTE, BLANK).split(COMMA);
		
		if (COL_NUM != cols.length)
		{
			super.logPrint.printDebugLog(lineNumber + "行目：項目数が不正です。");
			return false;
		}
		
		// 機器提供サービス契約番号を取得(入力ファイルのN行目)
		String kktkSvcKeiNo = cols[0];
		// 世代年月日時分秒を取得(入力ファイルのN行目)
		String geneAddDtm = cols[1];
		
		if ( (null == kktkSvcKeiNo|| "".equals(kktkSvcKeiNo)) )
		{
			super.logPrint.printDebugLog(lineNumber + "行目：機器提供サービス契約番号が入力されていません。");
			return false;
		}
		
		if ( (null == geneAddDtm || "".equals(geneAddDtm)) )
		{
			super.logPrint.printDebugLog(lineNumber + "行目：世代年月日時分秒が入力されていません。");
			return false;
		}
		
		if (kktkSvcKeiNo.length() != KKTK_SVC_KEI_NO_LENGTH)
		{
			super.logPrint.printDebugLog(lineNumber + "行目：機器提供サービス契約番号が" + KKTK_SVC_KEI_NO_LENGTH + "桁ではありません。");
			return false;
		}
		
		if (geneAddDtm.length() != GENE_ADD_DTM_LENGTH)
		{
			super.logPrint.printDebugLog(lineNumber + "行目：世代年月日時分秒が" + GENE_ADD_DTM_LENGTH + "桁ではありません。");
			return false;
		}
		
		return true;
	}

	/**
	 * 削除した行を取り除いた入力ファイルを作成します。
	 * 
	 * @param filePath 入力ファイルパス
	 * @exception IOException
	 */
	@Override
	void createNewInFile(String filePath) throws IOException {
		
		// 入力ファイルチェック
		if (!checkInFile(filePath))
		{
			return;
		}
	
		// 入力ファイル
		File inFile = new File(filePath);
		
		/**
		// 削除キー情報リスト
		ArrayList<LinkedHashMap<String, String>> list = null;
		
		// 入力ファイル毎の削除キー情報がある場合
		if (null != this.tableDeleteInfoMap && this.tableDeleteInfoMap.containsKey(inFile.getName()))
		{
			// 削除キー情報リストを取得
			list = this.tableDeleteInfoMap.get(inFile.getName());
		}
		*/
		
		// 入力ファイルから、削除した行を除いた入力ファイル
		File newInFile = new File(inFile.getParentFile().getPath() + "/" + inFile.getName() + ".new");
		
		BufferedWriter bw = new BufferedWriter(new FileWriter(newInFile));
//		BufferedReader br = new BufferedReader(new FileReader(inFile));
		
		for(int i = 0 ; i < listTimeOver.size() ; i ++) {

			String line = listTimeOver.get(i);
/**
		while ((line = br.readLine()) != null)
		{
			// 内容項目取得
			String[] cols = line.replaceAll(DOUBLE_QUOTE, BLANK).split(COMMA);
			// 機器提供サービス契約番号を取得(入力ファイルのN行目)
			String kktkSvcKeiNo = cols[0];
			// 世代年月日時分秒を取得(入力ファイルのN行目)
			String geneAddDtm = cols[1];
			
			LinkedHashMap<String, String> deleteMap = new LinkedHashMap<String, String>();
			deleteMap.put(KKTK_SVC_KEI_NO, kktkSvcKeiNo);
			deleteMap.put(GENE_ADD_DTM, geneAddDtm);
			
			// 削除キー情報リストにある場合
			if (null != list && list.contains(deleteMap))
			{
				// 出力しない
				continue;
			}
**/			
			bw.write(line);
			bw.newLine();
		}
		
//		br.close();
		
		bw.flush();
		bw.close();
		
		// 入力ファイルを置き換え
		if (inFile.delete())
		{
			newInFile.renameTo(new File(filePath));
		}
	}
}
