/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JDKSendFileToWMSBaseService
*	ソースファイル名	：JDKSendFileToWMSBaseService.java
*	作成者				：富士通　
*	作成日				：2013年03月08日
*＜機能概要＞
*　ファイルをWMSへ転送するベースサービス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/03/08   富士通		新規作成
*	v54.00.00	2021/09/01	FJ)星野		 ANK-4069-00-00_バッチ・DBサーバーリプレース対応
*********************************************************************/
package eo.business.common;

import static eo.common.constant.JDKStrConst.PATH_DLMT_UNIX;
import static eo.common.constant.JDKStrConst.PATH_DLMT_WIN;
import static eo.common.constant.JDKStrConst.SHORI_IRAI_RESULT_FIN;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import eo.common.constant.JDKStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public abstract class JDKSendFileToWMSBaseService extends JBSbatBusinessService
{
// ANK-4069-00-00対応 20210901 星野 DEL START
//	/** エラー区分（接続エラー）*/
//	private String ERR_KBN_CONNECT = "1";
// ANK-4069-00-00対応 20210901 星野 DEL END
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
	}

	/**
	 * インターフェースID取得
	 * @return インターフェースID
	 */
	protected abstract String getInterfaceId();
	
	/**
	 * ファイル名の長さ取得
	 * @return ファイル名の長さ
	 */
	protected abstract int getFileNameLength();
	
	/**
	 * ファイルタイプ取得
	 * @return ファイル名の開始文字
	 */
	protected abstract String getFileType();
	
	/**
	 * 転送ファイル名取得
	 * @return 転送ファイル名
	 */
	protected abstract String getSendFileName();
	
	/**
	 * 処理依頼を更新するか判定する
	 * 
	 * @return true:更新する/false:更新しない
	 */
	protected abstract boolean isUpdatesShoriIrai();
	
	/**
	 * ディレイド処理依頼番号を取得する
	 * @return ディレイド処理依頼番号
	 */
	protected String getDlydTrnReqNo()
	{
		// フリー項目よりディレイド処理依頼番号を取得
		String[] freeParam = commonItem.getFreeItem().split(JDKStrConst.FREE_DLMT);
		return freeParam[0];
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
// ANK-4069-00-00対応 20210901 星野 DEL START
//		ArrayList<String> putList = new ArrayList<String>(Arrays.asList(getSendFilePath()));
// ANK-4069-00-00対応 20210901 星野 DEL END
		
		// 対象ファイルを全て転送する
		for (String filePath : getTargetFile())
		{
// ANK-4069-00-00対応 20210901 星野 DEL START
//			HashMap<String, Object> resultMap = new HashMap<String, Object>();
//
//			boolean resultBln = false;
// ANK-4069-00-00対応 20210901 星野 DEL END
			if (renameFile(filePath, getSendFilePath()))
			{
// ANK-4069-00-00対応 20210901 星野 DEL START
//				// ファイル転送
//				resultBln = JCCBatCommon.putFTP(commonItem, putList, getInterfaceId(), resultMap);
// ANK-4069-00-00対応 20210901 星野 DEL END
			}

// ANK-4069-00-00対応 20210901 星野 DEL START
//			if (!resultBln)
//			{
//				// エラー発生時
//				updateShoriIraiResult(SHORI_IRAI_RESULT_APP_ERROR);
//
//				super.logPrint.printDebugLog("ファイル転送失敗");
//				throw new JBSbatBusinessException(JPCBatchMessageConstant.EDKB0010CE, 
//						new String[] {createPutFTPErrorMessage(resultMap)});
//			}
// ANK-4069-00-00対応 20210901 星野 DEL END
		}

		// 正常終了時
		updateShoriIraiResult(SHORI_IRAI_RESULT_FIN);
		return null;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	}

	/**
	 * パス文字列の連結
	 * 連結するパス文字列にパス区切り文字の設定を制御する。
	 * @param path1 パス文字列
	 * @param path2 パス文字列
	 * @return 連結したパス文字列
	 */
	private String rnktPath(String path1, String path2)
	{
		String pathDlmt = PATH_DLMT_UNIX;
		StringBuffer buff = new StringBuffer();
		
		if (path1.indexOf(PATH_DLMT_WIN) > -1 || path2.indexOf(PATH_DLMT_WIN) > -1)
		{
			pathDlmt = PATH_DLMT_WIN;
		}
		if (!path1.endsWith(pathDlmt))
		{
			return buff.append(path1).append(pathDlmt).append(path2).toString();
		}
		return buff.append(path1).append(path2).toString();
	}
	
	/**
	 * 処理対象ファイルの一覧を取得する
	 * @return 処理対象ファイル
	 */
	private List<String> getTargetFile()
	{
		File direc = new File(getSendDir());
		List<String> list = new ArrayList<String>();

		for (File file : direc.listFiles())
		{
			// 対象ファイルをピックアップ
			// ファイル名の長さが０より小さい場合は、ファイル名の長さのチェックはしない
			if ((getFileNameLength() == file.getName().length() || getFileNameLength() <= 0) 
					&& file.getName().startsWith(getFileType()))
			{
				list.add(file.getPath());
			}
		}
		
		return list;
	}
	
// ANK-4069-00-00対応 20210901 星野 DEL START
//	/**
//	 * FTP失敗時のメッセージを作成します
//	 * @param resultMap ftp実行結果マップ
//	 * @return エラーメッセージ
//	 */
//	@SuppressWarnings("unchecked")
//	private String createPutFTPErrorMessage(Map<String, Object> resultMap) {
//		String errMsg = "";
//
//		// ファイル作成失敗の場合
//		if (resultMap.size() == 0)
//		{
//			return String.format("[ファイル名]=(%s)", getSendFilePath()); 
//		}
//
//		// 接続エラーの場合
//		if (ERR_KBN_CONNECT.equals(resultMap.get("ERR_KBN").toString()))
//		{
//			HashMap<String, Object> shosai = (HashMap)resultMap.get("CONNECT_ERR");
//
//			// エラーメッセージ組み立て
//			errMsg = String.format("[エラー区分:エラーコード]=(%s:%s)", 
//					ERR_KBN_CONNECT, 
//					shosai.get("ERR_CD").toString());
//		}
//		else
//		{
//			// ファイルエラーの場合
//			ArrayList<HashMap> fileErr = (ArrayList<HashMap>)resultMap.get("FILE_ERR");
//			StringBuffer buff = new StringBuffer();
//			for (HashMap<String, Object> errMap : fileErr)
//			{
//
//				// エラーメッセージ組み立て
//				errMsg = String.format("[ファイル名:エラーフラグ:エラーコード]=(%s:%s:%s)", 
//						errMap.get("FILE_NAME").toString(),
//						errMap.get("ERR_FLG").toString(),
//						errMap.get("ERR_CD").toString());
//				buff.append(errMsg);
//			}
//			errMsg = buff.toString();
//		}
//
//		return errMsg;
//	}
// ANK-4069-00-00対応 20210901 星野 DEL END
	
	/**
	 * 処理依頼を更新します
	 * @param status ステータス
	 * @throws Exception
	 */
	private void updateShoriIraiResult(String status) throws Exception
	{
		if (!isUpdatesShoriIrai()) return;

		JCCBatCommon.updateShoriIraiResult(commonItem, getDlydTrnReqNo(), status, null);
		commonItem.getConnection().commit();
	}

	/**
	 * 転送ディレクトリを取得する
	 * @return 転送ディレクトリ
	 */
	private String getSendDir()
	{
		return rnktPath(JBSbatAplConst.getAplConstValue(JDKStrConst.ENV_GAIBU_SEND_DIR), getInterfaceId());
	}
	
	/**
	 * ファイルをリネームします
	 * @param src 元ファイル
	 * @param dest 後ファイル
	 * @return リネームファイル名
	 */
	private boolean renameFile(String src, String dest)
	{
		File srcF = new File(src);
		File destF = new File(dest);

		if (destF.exists())
		{
			return false;
		}
		
		srcF.renameTo(destF);
		return true;
	}
	
	/**
	 * 転送ファイルのパスを取得する
	 * @return 転送ファイルパス
	 */
	private String getSendFilePath()
	{
		return rnktPath(getSendDir(), getSendFileName());
	}

// 現在は、ファイルを転送する際にマージしないが、マージの必要がでたなら下記のコメントを復活させて
// マージ処理に置き換える
//	/**
//	 * ファイルをマージする
//	 * @param outFileName マージ後のファイル名
//	 * @param inFiles マージ対象ファイル
//	 * @return マージ後のファイル名
//	 * @throws IOException 例外
//	 */
//	private String mergeFile(String outFileName, List<String> inFiles) throws IOException
//	{
//		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(outFileName)));
//		File inF = null;
//		
//		for (String inFile : inFiles)
//		{
//			inF = new File(inFile);
//			
//			BufferedReader in = new BufferedReader(new FileReader(inF));
//			String line = "";
//			while((line = in.readLine()) != null)
//			{
//				out.println(line);
//			}
//			out.flush();
//			in.close();
//
//			inF.delete();
//		}
//		out.close();
//	
//		return outFileName;
//	}

}
