/********************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JPCBatCNCommon
 *	ソースファイル名：JPCBatCNCommon.java
 *	作成者			：富士通
 *	日付			：2011年05月26日
 *＜機能概要＞
 *	コンテンツ決済用のチェック処理を提供する。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/04/07	富士通		新規作成
 *	v5.00.00	2013/04/10	FJ)木村		【ソース静的解析による指摘対応】文字列の数値チェックを見直し
*
 ********************************************************************************/
package eo.business.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import eo.common.constant.JCNStrConst;


/**
 * コンテンツ決済用のチェック処理を提供する。<p>
 * <br>
 * @author 富士通
 */
public class JCNBatCheckUtil 
{
	
	/**
	 * CCMGより受信するファイルの形式チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でチェック対象のファイルレコードリストを設定します。<br>
	 *
	 * 2.引数をチェックした結果を返却します。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param sCheckList    チェック対象リスト。
	 * @return String       エラーコード
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	public static String checkFileRec(ArrayList<String> sCheckList) throws Exception
	{
		
//		boolean bFlg = true;
		
		String strRtnCd = "";
		
		int lDataCnt = 0;			// データ件数格納用
		int iHeadCnt = 0;			// ヘッダ件数カウンタ
		int iTralCnt = 0;			// トレーラ件数カウンタ
		int iDataCnt = 0;			// データ件数カウンタ
		
		ArrayList<String> sRecKbnList = new ArrayList<String>();

		for(int i = 0; i < sCheckList.size(); i++)
		{
			String[] strFileRec = sCheckList.get(i).split(JCNStrConst.S_DELIM_TAB);
			
			String strRecKbn = strFileRec[0];		// レコード区分
			sRecKbnList.add(strRecKbn);
			// ヘッダ部件数カウント
			if(JCNStrConst.S_FILECHK_REC_KBN_0.equals(strRecKbn))
			{
				iHeadCnt++;
			}
			// トレーラ部件数カウント
			if(JCNStrConst.S_FILECHK_REC_KBN_2.equals(strRecKbn))
			{
				iTralCnt++;
				lDataCnt = Integer.valueOf(strFileRec[1]);
			}
			
			// データ部件数カウント
			if(JCNStrConst.S_FILECHK_REC_KBN_1.equals(strRecKbn))
			{
				iDataCnt++;
			}
			if(!"".equals(strRtnCd))
			{
				return strRtnCd;
			}
		}
		// ヘッダ部が1件でない場合はエラー
		if(iHeadCnt != 1)
		{
			strRtnCd = JCNStrConst.S_FILECHK_ERR_0251;
			return strRtnCd;
		}
		
		// トレーラ部が1件でない場合はエラー
		if(iTralCnt != 1)
		{
			strRtnCd = JCNStrConst.S_FILECHK_ERR_0251;
			return strRtnCd;
		}
		
		// トレーラ部.件数が0件以上の場合に3形式でない場合エラー
		if(lDataCnt > 0
				&& (iDataCnt == 0
				|| iHeadCnt == 0))
		{
			strRtnCd = JCNStrConst.S_FILECHK_ERR_0251;
			return strRtnCd;
		}
		
		// トレーラ部.件数が0件の場合に2形式でない場合エラー
		if(lDataCnt == 0
				&& iHeadCnt == 0)
		{
			strRtnCd = JCNStrConst.S_FILECHK_ERR_0251;
			return strRtnCd;
		}
		
		// トレーラ部.件数≠レコード区分「1」の件数の場合エラー
		if(lDataCnt != iDataCnt)
		{
			strRtnCd = JCNStrConst.S_FILECHK_ERR_0252;
			return strRtnCd;
		}
		
		// レコード区分妥当性チェック
		for(int j = 0; j < sRecKbnList.size(); j++)
		{
			String sRecKbn = sRecKbnList.get(j);
			if(!JCNStrConst.S_FILECHK_REC_KBN_0.equals(sRecKbn)
					&& !JCNStrConst.S_FILECHK_REC_KBN_1.equals(sRecKbn)
					&& !JCNStrConst.S_FILECHK_REC_KBN_2.equals(sRecKbn))
			{
				strRtnCd = JCNStrConst.S_FILECHK_ERR_0266;
			}
		}
		return strRtnCd;
	}
	
	/**
	 * 文字列のNULLおよび空文字チェックを行います。
	 * <br>
	 * @param value チェック対象の文字列
	 * @return 文字列に値が格納されている場合はtrue、格納されていない場合はfalse
	 */
	public static boolean isNotNullCheck(String value)
	{
		if (value == null)
		{
			return false;
		}

		if (0 == value.trim().length())
		{
			return false;
		}

		return true;
	}
	
	/**
	 * 文字列を日付形式に変換して判定を行います。
	 * <br>
	 * @param str チェック対象の日時文字列
	 * @return 日付オブジェクトに変換可能な場合はtrue、変換不可の場合はfalse
	 */
	public static boolean isDateFormat(String str)
	{
		SimpleDateFormat instance = null;
		int len = str.length();
		StringBuffer strDate = new StringBuffer();

		switch (len)
		{
			case 6 :
				strDate.append(str);
				instance = new SimpleDateFormat("yyyyMM");
				break;
				
//			case 6 :
//				strDate.append(str);
//				instance = new SimpleDateFormat("HHmmss");
//				break;
				
			case 8 :
				strDate.append(str);
				instance = new SimpleDateFormat("yyyyMMdd");
				break;
				
			case 12 :
				strDate.append(str);
				instance = new SimpleDateFormat("yyyyMMddHHmm");
				break;
				
			case 14 :
				strDate.append(str);
				instance = new SimpleDateFormat("yyyyMMddHHmmss");
				break;
				
			case 17 :
				strDate.append(str);
				instance = new SimpleDateFormat("yyyyMMddHHmmssSSS");
				break;

			default :
				return false;

		}

		String chkDate = strDate.toString();

		try
		{
			Date date = instance.parse(chkDate);
			return chkDate.equals(instance.format(date));
		}
		catch (ParseException pe)
		{
			return false;
		}
	}
	
	/**
	 * 文字列を日付形式(時分秒)に変換して判定を行います。
	 * <br>
	 * @param str チェック対象の時分秒文字列
	 * @return 日付オブジェクトに変換可能な場合はtrue、変換不可の場合はfalse
	 */
	public static boolean isDateFormatHms(String str)
	{
		SimpleDateFormat instance = null;
		int len = str.length();
		StringBuffer strDate = new StringBuffer();

		switch (len)
		{
			case 6 :
				strDate.append(str);
				instance = new SimpleDateFormat("HHmmss");
				break;
				
			default :
				return false;

		}

		String chkDate = strDate.toString();

		try
		{
			Date date = instance.parse(chkDate);
			return chkDate.equals(instance.format(date));
		}
		catch (ParseException pe)
		{
			return false;
		}
	}
	
	/**
	 * 文字列の数値チェックを行います。
	 * <br>
	 * @param value チェック対象の文字列
	 * @return 文字列がlong型に変換できた場合はtrue、変換できない場合はfalse
	 */
	public static boolean isNumberFormat(String value)
	{
		try
		{
			long ldata = Long.parseLong(value);
			return true;
		}
		catch (NumberFormatException le)
		{
			return false;
		}
	}
}
