/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCNumberEncode
*   ソースファイル名：JCCNumberEncode.java
*   作成者          ：富士通
*   日付            ：2018年05月30日
*＜機能概要＞
*   数列を暗号化します。
*＜修正履歴＞
*   バージョン	修正日		修正者		修正内容
*   v31.00.00	2018/05/30	富士通		新規作成(【ANK-3136-00-00】OPMSハードウエア保守切れ対応(STEP2-2))
*
**********************************************************************/

package eo.common.util;

import java.util.HashMap;

/**
 * 数列を暗号化します。
 * 
 * @author 富士通
 */
public class JCCNumberEncode
{
	/**
	 * 数列の桁数
	 */
	private static final int NUMBER_LENGTH = 14;

	/**
	 * 暗号化用の英字のマッピング配列
	 */
	private static final HashMap<String, String> ENCODE_CHAR_MAPPING = new HashMap<String, String>();

	/**
	 * 暗号化用の数字のマッピング配列
	 */
	private static final HashMap<String, String> ENCODE_NUM_MAPPING = new HashMap<String, String>();

	static
	{
		// 暗号化用の英字のマッピング配列設定
		ENCODE_CHAR_MAPPING.put("0", "A");
		ENCODE_CHAR_MAPPING.put("1", "C");
		ENCODE_CHAR_MAPPING.put("2", "E");
		ENCODE_CHAR_MAPPING.put("3", "G");
		ENCODE_CHAR_MAPPING.put("4", "I");
		ENCODE_CHAR_MAPPING.put("5", "K");
		ENCODE_CHAR_MAPPING.put("6", "M");
		ENCODE_CHAR_MAPPING.put("7", "O");
		ENCODE_CHAR_MAPPING.put("8", "Q");
		ENCODE_CHAR_MAPPING.put("9", "S");
		
		// 暗号化用の数字のマッピング配列設定
		ENCODE_NUM_MAPPING.put("0", "0");
		ENCODE_NUM_MAPPING.put("1", "8");
		ENCODE_NUM_MAPPING.put("2", "2");
		ENCODE_NUM_MAPPING.put("3", "10");
		ENCODE_NUM_MAPPING.put("4", "4");
		ENCODE_NUM_MAPPING.put("5", "12");
		ENCODE_NUM_MAPPING.put("6", "6");
		ENCODE_NUM_MAPPING.put("7", "13");
		ENCODE_NUM_MAPPING.put("8", "5");
		ENCODE_NUM_MAPPING.put("9", "11");
		ENCODE_NUM_MAPPING.put("10", "3");
		ENCODE_NUM_MAPPING.put("11", "9");
		ENCODE_NUM_MAPPING.put("12", "1");
		ENCODE_NUM_MAPPING.put("13", "7");
	}

	/**
	 * 数列を暗号化します。
	 * @param targetNo 処理対象の数列
	 * @return 暗号化した結果
	 */
	public static String numberEncode(String targetNum)
	{
		// 桁数が14桁以外の場合は暗号化を行わない。
		if (targetNum.length() != NUMBER_LENGTH)
		{
			return targetNum;
		}
		
		String [] targetNumArray = new String [NUMBER_LENGTH];
		String [] tmpArray = new String [NUMBER_LENGTH];
		
		// 配列に格納する
		for (int i = 0; i < NUMBER_LENGTH; i++)
		{
			targetNumArray[i] = String.valueOf(targetNum.charAt(i));
		}
		
		// 変換1：各桁の数字に14桁目の数字を足し、その合計の下1桁を各桁に設定する。
		// ただし、14桁目は処理の対象外とする。
		for (int i = 0; i < NUMBER_LENGTH - 1; i++)
		{
			targetNumArray[i] = String.valueOf((Integer.valueOf(targetNumArray[i])
					+ Integer.valueOf(targetNumArray[NUMBER_LENGTH - 1])) % 10);
		}
		
		// 変換2：ENCODE_CHAR_MAPPINGに従い、数字を英字に置換する。
		for (int i = 0; i < NUMBER_LENGTH; i++)
		{
			targetNumArray[i] = ENCODE_CHAR_MAPPING.get(targetNumArray[i]);
		}
		
		// 変換3：ENCODE_NUM_MAPPINGに従い、文字列の並び順を変える。
		for (int i = 0; i < NUMBER_LENGTH; i++)
		{
			tmpArray[Integer.valueOf(ENCODE_NUM_MAPPING.get(String.valueOf(i)))] = targetNumArray[i];
		}
		
		String tmptargetNum = tmpArray[0];
		
		// 配列を文字列にする。
		for (int i = 1; i < NUMBER_LENGTH; i++)
		{
			tmptargetNum = tmptargetNum + tmpArray[i];
		}
		
		return tmptargetNum;
	}
}

