/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom						 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKHisDelToolSvcKei
*	ソースファイル名	：JBSbatKKHisDelToolSvcKei.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>
* KK0081	サービス契約				KK_T_SVC_KEI<BR>
* KK0091	サービス契約<eo光ネット>	KK_T_SVC_KEI_EOH_NET<BR>
* KK0101	サービス契約<eo光TV>		KK_T_SVC_KEI_EOH_TV<BR>
* KK0111	サービス契約<eo光電話>		KK_T_SVC_KEI_EOH_TEL<BR>
* KK0121	サービス契約<eoモバイル>	KK_T_SVC_KEI_EOMOBA<BR>
* <BR>
* 入力ファイルとテーブルの対応は以下の通りです。<BR>
* KK0081:KKIFM616001.csv<BR>
* KK0091:KKIFM616002.csv<BR>
* KK0101:KKIFM616003.csv<BR>
* KK0111:KKIFM616004.csv<BR>
* KK0121:KKIFM616005.csv<BR>
* <BR>
* @author 富士通
*/
public class JBSbatKKHisDelToolSvcKei extends JBSbatKKAbstractHistoryDeleteTool
{
	
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	/** テーブル(サービス契約(eo光ネット))*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_EOH_NET = "KK_T_SVC_KEI_EOH_NET";
	/** テーブル(サービス契約(eo光TV))*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_EOH_TV = "KK_T_SVC_KEI_EOH_TV";
	/** テーブル(サービス契約(eo光電話))*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_EOH_TEL = "KK_T_SVC_KEI_EOH_TEL";
	/** テーブル(サービス契約(eoモバイル))*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_EOMOBA = "KK_T_SVC_KEI_EOMOBA";
	
	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	/** テーブルアクセスクラス(サービス契約(eo光ネット))*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_EOH_NET = null;
	/** テーブルアクセスクラス(サービス契約(eo光TV))*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_EOH_TV = null;
	/** テーブルアクセスクラス(サービス契約(eo光電話))*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_EOH_TEL = null;
	/** テーブルアクセスクラス(サービス契約(eoモバイル))*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_EOMOBA = null;

	/** キー：サービス契約番号 */
	private static final String SVC_KEI_NO = "SVC_KEI_NO";
	/** キー：世代年月日時分秒 */
	private static final String GENE_ADD_DTM = "GENE_ADD_DTM";
	
	/** 入力ファイル項目数 */
	private static final int COL_NUM = 2;
	
	/** サービス契約番号桁数 */
	private static final int SVC_KEI_NO_LENGTH = 10;
	/** 世代年月日時分秒桁数 */
	private static final int GENE_ADD_DTM_LENGTH = 17;
	
	/** 入力ファイル(KK0081) */
	private static final String DEL_UNLOAD_FILE_KK0081 = "KKIFM616001.csv";
	/** 入力ファイル(KK0091) */
	private static final String DEL_UNLOAD_FILE_KK0091 = "KKIFM616002.csv";
	/** 入力ファイル(KK0101) */
	private static final String DEL_UNLOAD_FILE_KK0101 = "KKIFM616003.csv";
	/** 入力ファイル(KK0111) */
	private static final String DEL_UNLOAD_FILE_KK0111 = "KKIFM616004.csv";
	/** 入力ファイル(KK0121) */
	private static final String DEL_UNLOAD_FILE_KK0121 = "KKIFM616005.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アクセスクラスを生成します
		// KK0081	サービス契約				KK_T_SVC_KEI
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		// KK0091	サービス契約<eo光ネット>	KK_T_SVC_KEI_EOH_NET
		db_KK_T_SVC_KEI_EOH_NET = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_EOH_NET);
		// KK0101	サービス契約<eo光TV>		KK_T_SVC_KEI_EOH_TV
		db_KK_T_SVC_KEI_EOH_TV = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_EOH_TV);
		// KK0111	サービス契約<eo光電話>		KK_T_SVC_KEI_EOH_TEL
		db_KK_T_SVC_KEI_EOH_TEL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_EOH_TEL);
		// KK0121	サービス契約<eoモバイル>	KK_T_SVC_KEI_EOMOBA
		db_KK_T_SVC_KEI_EOMOBA = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_EOMOBA);
		
		// 引数チェックに該当した場合
		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 svcKeiNo = cols[0];
			// 世代年月日時分秒を取得(入力ファイルのN行目)
			String geneAddDtm = cols[1];
			
			// キー情報を生成
			LinkedHashMap<String, String> deleteMap = new LinkedHashMap<String, String>();
			deleteMap.put(SVC_KEI_NO, svcKeiNo);
			deleteMap.put(GENE_ADD_DTM, geneAddDtm);
			
			// KK0081	サービス契約	KK_T_SVC_KEI
			//ST4-2014-0000048 DEL START
/**
			if (DEL_UNLOAD_FILE_KK0081.equals(inFile.getName()))
			{
				int svcKeiDelCount = this.executeKK_T_SVC_KEI_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI, deleteMap, svcKeiDelCount, inFile.getName());
			}
**/
			//ST4-2014-0000048 DEL END
			// KK0091	サービス契約<eo光ネット>	KK_T_SVC_KEI_EOH_NET
			if (DEL_UNLOAD_FILE_KK0091.equals(inFile.getName()))
			{
				//ST4-2014-0000048 ADD START
				int svcKeiDelCount = this.executeKK_T_SVC_KEI_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI, deleteMap, svcKeiDelCount, inFile.getName());
				//ST4-2014-0000048 ADD END
				int svcKeiEohNetDelCount = this.executeKK_T_SVC_KEI_EOH_NET_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI_EOH_NET, deleteMap, svcKeiEohNetDelCount, inFile.getName());
			}
			// KK0101	サービス契約<eo光TV>		KK_T_SVC_KEI_EOH_TV
			else if (DEL_UNLOAD_FILE_KK0101.equals(inFile.getName()))
			{
				//ST4-2014-0000048 ADD START
				int svcKeiDelCount = this.executeKK_T_SVC_KEI_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI, deleteMap, svcKeiDelCount, inFile.getName());
				//ST4-2014-0000048 ADD END
				int svcKeiEohTvDelCount = this.executeKK_T_SVC_KEI_EOH_TV_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI_EOH_TV, deleteMap, svcKeiEohTvDelCount, inFile.getName());
			}
			// KK0111	サービス契約<eo光電話>		KK_T_SVC_KEI_EOH_TEL
			else if (DEL_UNLOAD_FILE_KK0111.equals(inFile.getName()))
			{
				//ST4-2014-0000048 ADD START
				int svcKeiDelCount = this.executeKK_T_SVC_KEI_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI, deleteMap, svcKeiDelCount, inFile.getName());
				//ST4-2014-0000048 ADD END
				int svcKeiEohTelDelCount = this.executeKK_T_SVC_KEI_EOH_TEL_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI_EOH_TEL, deleteMap, svcKeiEohTelDelCount, inFile.getName());
			}
			// KK0121	サービス契約<eoモバイル>	KK_T_SVC_KEI_EOMOBA
			else if (DEL_UNLOAD_FILE_KK0121.equals(inFile.getName()))
			{
				//ST4-2014-0000048 ADD START
				int svcKeiDelCount = this.executeKK_T_SVC_KEI_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI, deleteMap, svcKeiDelCount, inFile.getName());
				//ST4-2014-0000048 ADD END
				int svcKeiEomobaDelCount = this.executeKK_T_SVC_KEI_EOMOBA_PKDELETE(svcKeiNo, geneAddDtm);
				this.printDeleteLog(D_TBL_NAME_KK_T_SVC_KEI_EOMOBA, deleteMap, svcKeiEomobaDelCount, 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 
	{
		super.printTotalDeleteLog();
		
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_T_SVC_KEI_EOH_NET.close();
		db_KK_T_SVC_KEI_EOH_TV.close();
		db_KK_T_SVC_KEI_EOH_TEL.close();
		db_KK_T_SVC_KEI_EOMOBA.close();
	}
	
	/**
	 * サービス契約テーブルに対して主キーで物理削除を行います。
	 * @param svcKeiNo サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 削除件数
	 * @throws Exception
	 */
	private int executeKK_T_SVC_KEI_PKDELETE(String svcKeiNo, String geneAddDtm) throws Exception 
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(SVC_KEI_NO, svcKeiNo);
		whereMap.setValue(GENE_ADD_DTM, geneAddDtm);

		// DBアクセスを実行します
		return db_KK_T_SVC_KEI.deleteByPrimaryKeys(whereMap);
	}
	
	/**
	 * サービス契約<eo光ネット>テーブルに対して主キーで物理削除を行います。
	 * @param svcKeiNo サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 削除件数
	 * @throws Exception
	 */
	private int executeKK_T_SVC_KEI_EOH_NET_PKDELETE(String svcKeiNo, String geneAddDtm) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(SVC_KEI_NO, svcKeiNo);
		whereMap.setValue(GENE_ADD_DTM, geneAddDtm);

		// DBアクセスを実行します
		return db_KK_T_SVC_KEI_EOH_NET.deleteByPrimaryKeys(whereMap);
	}
	
	/**
	 * サービス契約<eo光TV>テーブルに対して主キーで物理削除を行います。
	 * @param svcKeiNo サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 削除件数
	 * @throws Exception
	 */
	private int executeKK_T_SVC_KEI_EOH_TV_PKDELETE(String svcKeiNo, String geneAddDtm) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(SVC_KEI_NO, svcKeiNo);
		whereMap.setValue(GENE_ADD_DTM, geneAddDtm);

		// DBアクセスを実行します
		return db_KK_T_SVC_KEI_EOH_TV.deleteByPrimaryKeys(whereMap);
	}
	
	/**
	 * サービス契約<eo光電話>テーブルに対して主キーで物理削除を行います。
	 * @param svcKeiNo サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 削除件数
	 * @throws Exception
	 */
	private int executeKK_T_SVC_KEI_EOH_TEL_PKDELETE(String svcKeiNo, String geneAddDtm) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(SVC_KEI_NO, svcKeiNo);
		whereMap.setValue(GENE_ADD_DTM, geneAddDtm);

		// DBアクセスを実行します
		return db_KK_T_SVC_KEI_EOH_TEL.deleteByPrimaryKeys(whereMap);
	}
	
	/**
	 * サービス契約<eoモバイル>テーブルに対して主キーで物理削除を行います。
	 * @param svcKeiNo サービス契約番号
	 * @param geneAddDtm 世代年月日時分秒
	 * @return 削除件数
	 * @throws Exception
	 */
	private int executeKK_T_SVC_KEI_EOMOBA_PKDELETE(String svcKeiNo, String geneAddDtm) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(SVC_KEI_NO, svcKeiNo);
		whereMap.setValue(GENE_ADD_DTM, geneAddDtm);

		// DBアクセスを実行します
		return db_KK_T_SVC_KEI_EOMOBA.deleteByPrimaryKeys(whereMap);
	}
	
	/**
	 * 入力パラメータのチェックを行います。
	 * @param line 入力ファイルの各行
	 * @param lineNumber 該当行
	 * @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 svcKeiNo = cols[0];
		// 世代年月日時分秒を取得(入力ファイルのN行目)
		String geneAddDtm = cols[1];
		
		if ( (null == svcKeiNo|| "".equals(svcKeiNo)) )
		{
			super.logPrint.printDebugLog(lineNumber + "行目：サービス契約番号が入力されていません。");
			return false;
		}
		
		if ( (null == geneAddDtm || "".equals(geneAddDtm)) )
		{
			super.logPrint.printDebugLog(lineNumber + "行目：世代年月日時分秒が入力されていません。");
			return false;
		}
		
		if (svcKeiNo.length() != SVC_KEI_NO_LENGTH)
		{
			super.logPrint.printDebugLog(lineNumber + "行目：サービス契約番号が" + 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 svcKeiNo = cols[0];
			// 世代年月日時分秒を取得(入力ファイルのN行目)
			String geneAddDtm = cols[1];
			LinkedHashMap<String, String> deleteMap = new LinkedHashMap<String, String>();
			deleteMap.put(SVC_KEI_NO, svcKeiNo);
			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));
		}
	}
}
