/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JZMejbNumberPartsBase
*	ソースファイル名：JZMejbNumberPartsBase.java
*	作成者			：富士通
*	日付			：2015年02月12日
*＜機能概要＞
*	採番部品のスーパークラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v13.00.00   2015/02/12  FJ)寺園     ANK-2433-00-00  新規作成
*
**********************************************************************/

package eo.ejb.common.edit;

import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.common.JPCModelCommon;

/**
 * <p>
 * 採番部品のスーパークラスです。<br>
 * 採番部品を作成する場合は、本クラスを継承して実装してください。
 * </p>
 * @author 富士通
 */
public class JZMejbNumberPartsBase
{

	/** 変換配列 (禁止文字)*/
	private static final HashMap<String, String> ZM_CHANGE_DATA = new HashMap<String, String>();
	
	static
	{
		ZM_CHANGE_DATA.put("0", "3");
		ZM_CHANGE_DATA.put("1", "4");
		ZM_CHANGE_DATA.put("2", "5");
		ZM_CHANGE_DATA.put("6", "7");
		ZM_CHANGE_DATA.put("9", "8");
		ZM_CHANGE_DATA.put("l", "m");
		ZM_CHANGE_DATA.put("L", "M");
		ZM_CHANGE_DATA.put("o", "p");
		ZM_CHANGE_DATA.put("O", "P");
		ZM_CHANGE_DATA.put("z", "a");
		ZM_CHANGE_DATA.put("Z", "A");
		ZM_CHANGE_DATA.put("q", "r");
		ZM_CHANGE_DATA.put("Q", "R");
		ZM_CHANGE_DATA.put("b", "c");
		ZM_CHANGE_DATA.put("B", "C");
		ZM_CHANGE_DATA.put("i", "j");
		ZM_CHANGE_DATA.put("I", "J");
	}

	/**
	 * <p>
	 * 機能コードがチェックのみの実行モードか判定します。<br>
	 * 制約上、奇数は実行モード、偶数はチェックモードとして扱います。
	 * </p>
	 * @param inMsg 処理対象のCBSMsg
	 * @return チェックモードの場合はtrue
	 */
	protected static boolean isFuncMode(CAANMsg inMsg)
	{
		String func = inMsg.getString(JCMConstants.FUNC_CODE_KEY);
		int in = Integer.parseInt(func);
		boolean ret = (in % 2) == 0;
		return ret;
	}
	
	/**
	 * <p>
	 * Webアクセス認証キー採番処理。<br>
	 * </p>
	 * @param ketaSu 桁数
	 * @return 採番した番号
	 */
	public static String getWebAccssNskey(int ketaSu)
	{
		// 変換処理
		StringBuffer key = null;

		do
		{
			// 初期化
			key = new StringBuffer();

			// 乱数を発生
			String random = JPCModelCommon.getRandomChar(ketaSu);

			for (int i = 0; i < random.length(); i++)
			{

				// 算出対象の番号に含まれる、英字・記号を数値に置換
				String strSub = String.valueOf(random.charAt(i));

				if (ZM_CHANGE_DATA.containsKey(strSub))
				{
					strSub = ZM_CHANGE_DATA.get(strSub);
				}

				key.append(strSub);
			}
		}
		// 採番された値が全て数字の場合はやり直し
		while (isNumChk(key.toString()));

		return key.toString();
	}

	/**
	 * <p>
	 * Webアクセス認証キーパスワード採番処理。<br>
	 * @param ketaSu 桁数
	 * @return 採番した番号
	 * </p>
	 */
	public static String getWebAccssNskeyPwd(int ketaSu)
	{
		
		// 乱数を発生。
		String random = JPCModelCommon.getRandomNumber(ketaSu);
		
		// パスワードとして返却する
		return random;
		
	}
	
	/**
	 * 文字列の値が全て数字か否かチェックする
	 * <p>
	 * </p>
	 * @param value チェックする文字列
	 * @return true：全て数字　false：全て数字でない
	 */
	private static boolean isNumChk(String value)
	{
		// 文字列の文字数分繰り返す
		char[] valAry = value.toCharArray();

		int numCnt = 0;
		int engCnt = 0;

		for (int i = 0; i < valAry.length; i++)
		{
			// 一文字取得する
			char target = valAry[i];

			// ０〜９の場合
			if (String.valueOf(target).matches("[0-9]"))
			{
				numCnt++;
			}

			// A〜Zの場合
			if (String.valueOf(target).matches("[a-z]"))
			{
				engCnt++;
			}
			
			// A〜Zの場合
			if (String.valueOf(target).matches("[A-Z]"))
			{
				engCnt++;
			}

		}

		// 文字列の文字数と数字または英字の数が同一の場合
		if (value.length() == numCnt || value.length() == engCnt)
		{
			// 文字列が全て数字もしくは英字となるのでtrueを返却
			return true;
		}
		// 混在のため、false
		return false;
	}

}
