/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：プロジェクト共通
*   モジュール名    ：JKKBatKDDICheckUtil
*   ソースファイル名：JKKBatKDDICheckUtil.java
*   作成者          ：富士通
*   日付            ：2012年10月09日
*＜機能概要＞
*   KDDIデータチェック部品
*＜修正履歴＞
*   バージョン  修正日       修正者     修正内容
*   v4.00.00    2012/10/09   FJ) 北村	新規作成
**********************************************************************/
package eo.business.common;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;

import eo.common.constant.JKKStrConst;

/**
 * チェック処理を提供する。<p>
 * ジョブで実装します。
 * <BR>
 * @author 富士通
 */
public class JKKBatKDDICheckUtil extends JCCBatCommon
{

	/**
	 * 桁数チェック処理
	 * <br>
	 * @param value チェックする文字列
	 * @param valueMinSize 指定サイズ(最小)
	 * @param valueMaxSize 指定サイズ(最大)
	 * @param mojiCd 文字コード（ＯＳ準拠の場合は""（空）を指定）
	 * @param mojiSbt 文字種別（1：文字数でチェック、2：バイト数でチェック）
	 * @return 処理結果を格納したMap
	 * 			KDDI_CHK_RSLT_BOOL		チェック結果コード（正常：true　異常：false）
	 * 			KDDI_CHK_RSLT_VAL		チェック結果の値
	 * @throws UnsupportedEncodingException 文字列サイズ調整処理にて、例外が発生した場合
	 */
	public static HashMap<String, Object> checkDigitno(String value, 
														int valueMinSize,
														int valueMaxSize,
														String mojiCd,
														String mojiSbt) throws UnsupportedEncodingException
	{
		byte[] paraByte = null;
		HashMap<String, Object> resMap = new HashMap<String, Object>();


		if (!isNotNull(value)) 
		{
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_BOOL, true);
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_VAL, value);
			return resMap;
		}

		if (valueMinSize <= 0) 
		{
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_BOOL, false);
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_VAL, value);
			return resMap;
		}
		
		if (valueMaxSize <= 0) 
		{
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_BOOL, false);
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_VAL, value);
			return resMap;
		}
		
		if (valueMaxSize < valueMinSize) 
		{
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_BOOL, false);
			resMap.put(JKKStrConst.KDDI_CHK_RSLT_VAL, value);
			return resMap;
		}
		
		Boolean isResult = true;
		String editVal = value;
		
		if (JKKStrConst.KDDI_MOJISBT_MOJI.equals(mojiSbt))
		{
			// チェックする文字列の文字数を取得する
			int paraMojiSize = value.length();
			
			// 1：文字数の場合
			if (paraMojiSize < valueMinSize  || paraMojiSize > valueMaxSize)
			{
				// チェックする文字列が指定サイズ(最小)と指定サイズ(最大)の範囲外だった場合
				isResult = false;
			}
			if (paraMojiSize > valueMaxSize)
			{
				// チェックする文字列が指定サイズ(最大)を超えていた場合
				editVal = value.substring(0, valueMaxSize);
			}
		}
		else if (JKKStrConst.KDDI_MOJISBT_BYTE.equals(mojiSbt))
		{
			// 2：バイト数の場合
			if ("".equals(mojiCd)) 
			{
				// 文字コードＯＳ準拠
				paraByte = value.getBytes();
			}
			else 
			{
				// 文字コード指定
				paraByte = value.getBytes(mojiCd);
			}
			
			// 入力文字列のバイトサイズを取得する
			int paraByteSize = paraByte.length;
			
			if (paraByteSize < valueMinSize  || paraByteSize > valueMaxSize)
			{
				// チェックする文字列が指定サイズ(最小)と指定サイズ(最大)の範囲外だった場合
				isResult = false;
			}
			if (paraByteSize > valueMaxSize)
			{
				// チェックする文字列が指定サイズ(最大)を超えていた場合
				int totalunitCharByte = 0;
				StringBuffer cutValue = new StringBuffer();
				for (int i = 0; i < value.length(); i++)
				{
					String unitValue = value.substring(i, i + 1);
					
					byte[] unitCharByte = null;
					if ("".equals(mojiCd)) 
					{
						// 文字コードＯＳ準拠
						unitCharByte = unitValue.getBytes();
					}
					else 
					{
						// 文字コード指定
						unitCharByte = unitValue.getBytes(mojiCd);
					}
					
					totalunitCharByte += unitCharByte.length;
					
					if (totalunitCharByte > valueMaxSize) 
					{
						break;
					}
					
					cutValue.append(unitValue);
				}
				
				// チェックする文字列に調整後の値を設定
				editVal = cutValue.toString();
			}
		}
		
		resMap.put(JKKStrConst.KDDI_CHK_RSLT_BOOL, isResult);
		resMap.put(JKKStrConst.KDDI_CHK_RSLT_VAL, editVal);
		
		return resMap;
	}
}
