/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0111NumberParts
*	ソースファイル名：JKKejbKK0111NumberParts.java
*	作成者			：富士通
*	日付			：2011年04月21日
*＜機能概要＞
*	サービス契約<eo光電話>採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/04/21	富士通		新規作成
*
**********************************************************************/

package eo.ejb.common.edit;

import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.common.JCCModelCommon;

/**
 * <p>
 * サービス契約<eo光電話>採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0111NumberParts extends JKKejbNumberPartsBase
{

	/** サービス契約<eo光電話>シーケンス名 */
	private static final String SEQ_PPP_NINSHO_ID = "SEQ_PPP_NINSHO_ID";

	/** サービス契約<eo光電話>シーケンス名（パスワード用） */
	private static final String SEQ_PPP_NINSHO_ID_PWD = "SEQ_PPP_NINSHO_ID_PWD";

	/** 接頭語(P) */
	private static final String PREFIX_P = "P";

	/** 乱数発生桁数（10桁） */
	private static final int RANDOM_LENGTH = 10;
	
	/** 桁数(8) */
	private static final int SEQ_LENGTH_8 = 8;

	/** 桁数(10) */
	private static final int SEQ_LENGTH_10 = 10;

	/** 接尾語 */
	private static final String SUFFIX_TEL = "@TEL";

	/** 変換表Ａ */
	private static final HashMap<String, String> CHANGE_LIST_A = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_LIST_A.put("0", "KMNPQRSTUV");
		CHANGE_LIST_A.put("1", "PQRSTUVWXY");
		CHANGE_LIST_A.put("2", "TUVWXYZABC");
		CHANGE_LIST_A.put("3", "IJKMNPQRST");
		CHANGE_LIST_A.put("4", "CDEFGHIJKM");
		CHANGE_LIST_A.put("5", "MNPQRSTUVW");
		CHANGE_LIST_A.put("6", "ABCDEFGHIJ");
		CHANGE_LIST_A.put("7", "STUVWXYZAB");
		CHANGE_LIST_A.put("8", "HIJKMNPQRS");
		CHANGE_LIST_A.put("9", "NPQRSTUVWX");
	}

	/** 変換表Ｂ */
	private static final HashMap<String, String> CHANGE_LIST_B = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_LIST_B.put("0", "kmnpqrstuv");
		CHANGE_LIST_B.put("1", "pqrstuvwxy");
		CHANGE_LIST_B.put("2", "tuvwxyzabc");
		CHANGE_LIST_B.put("3", "ijkmnpqrst");
		CHANGE_LIST_B.put("4", "cdefghijkm");
		CHANGE_LIST_B.put("5", "mnpqrstuvw");
		CHANGE_LIST_B.put("6", "abcdefghij");
		CHANGE_LIST_B.put("7", "stuvwxyzab");
		CHANGE_LIST_B.put("8", "hijkmnpqrs");
		CHANGE_LIST_B.put("9", "npqrstuvwx");
	}

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0111NumberParts()
	{
	}

	/**
	 * <p>
	 * サービス契約<eo光電話>のPPP認証IDの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光電話>のPPP認証ID
	 */
	public Object getPppNinshoId(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		value = JCCModelCommon.getFormatedNextSeq(SEQ_PPP_NINSHO_ID, PREFIX_P, SEQ_LENGTH_8);

		// 変換処理
		StringBuffer buffer = new StringBuffer();

		// (1)シーケンスの1桁目を設定する
		buffer.append(value.substring(0, 1));
		// (2)シーケンスの2桁目,3桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(2, 3), value.substring(3, 4)));
		// (3)シーケンスの6桁目,7桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(6, 7), value.substring(7, 8)));
		// (4)シーケンスの5桁目を設定する
		buffer.append(value.substring(5, 6));
		// (5)シーケンスの6桁目を設定する
		buffer.append(value.substring(6, 7));
		// (6)シーケンスの1桁目,2桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(1, 2), value.substring(2, 3)));
		// (7)シーケンスの3桁目,4桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(3, 4), value.substring(4, 5)));
		// (8)シーケンスの7桁目を設定する
		buffer.append(value.substring(7, 8));
		// (9)シーケンスの8桁目を設定する
		buffer.append(value.substring(8, 9));
		// (10)設定された値からチェックデジットを算出して設定する
		buffer.append(getCheckDigit21(buffer.toString()));
		// (11)接尾語を設定する
		buffer.append(SUFFIX_TEL);

		return buffer.toString();
	}

	/**
	 * <p>
	 * サービス契約<eo光電話>のPPP認証IDパスワードの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光電話>のPPP認証IDパスワード
	 */
	public Object getPppNinshoIdPwd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		Long seq = Long.parseLong(JCCModelCommon.getFormatedNextSeq(SEQ_PPP_NINSHO_ID_PWD, "", SEQ_LENGTH_10));

		// シード値を使用して乱数を発生
		String random = getRandomNumberSeed(RANDOM_LENGTH, seq);

		// 変換処理
		StringBuffer pwd = new StringBuffer();

		// (1)乱数の9桁目,10桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(8, 9), random.substring(9, 10)));
		// (2)乱数の1桁目,10桁目の加算値の下1桁目を設定する
		pwd.append(toNumLastDigit(random.substring(0, 1), random.substring(9, 10)));
		// (3)乱数の3桁目,4桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(2, 3), random.substring(3, 4)));
		// (4)乱数の9桁目を設定する
		pwd.append(random.substring(8, 9));
		// (5)乱数の8桁目を設定する
		pwd.append(random.substring(7, 8));
		// (6)乱数の5桁目,6桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(4, 5), random.substring(5, 6)));
		// (7)乱数の2桁目,4桁目の加算値の下1桁目を設定する
		pwd.append(toNumLastDigit(random.substring(1, 2), random.substring(3, 4)));
		// (8)乱数の7桁目,8桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(6, 7), random.substring(7, 8)));

		// パスワードとして返却する
		return pwd.toString();
	}

	/**
	 * <p>
	 * 変換表Ａを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private String toAlphabetA(String str1, String str2)
	{
		// 変換表Ａを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_A);
	}

	/**
	 * <p>
	 * 変換表Ｂを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private String toAlphabetB(String str1, String str2)
	{
		// 変換表Ｂを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_B);
	}

}
