/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKUKojiakNoNP
*	ソースファイル名：JKUKojiakNoNP.java
*	作成者			：富士通
*	日付			：2011年03月14日
*＜機能概要＞
*	申込採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/03/14	富士通		新規作成
*
**********************************************************************/

package eo.common.util;

/**
 * <p>
 * 工事案件番号採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKUKojiakNoNP
{
	/** 定数*/
	/** 正規表現数字0-9およびa-z*/
	private static final String REG_NUMERIC_AND_LOWER = "[0-9a-z]";
	/** 正規表現A-Y*/
	private static final String REG_ALFA_A_Y = "[A-Y]";
	/** 正規表現Z*/
	private static final String REG_ALFA_Z = "[Z]";
	
	/**
	 * コンストラクタです。
	 */
	public JKUKojiakNoNP()
	{
	}
	
	/**
	 * 工事案件番号を採番します。
	 * @param mskmshoNo 申込書番号
	 * @param kojiakNo  次候補の工事案件番号を取得する元の工事案件番号
	 * @return 次候補の工事案件番号
	 * 
	 */
	public String getKojiakNo(String mskmshoNo, String kojiakNo)
	{
		// 申込書番号1桁目
		String mskmshoNo1keta = mskmshoNo.substring(0, 1);
		// 工事案件番号1桁目
		String str1keta = kojiakNo.substring(0, 1);
		// 工事案件番号2桁目
		String str2keta = kojiakNo.substring(1, 2);
		// 工事案件番号3桁目以降
		String str3keta = kojiakNo.substring(2, 10);
		
		StringBuffer nextKojiakNo = new StringBuffer();
		// 1桁：0-9、2桁：0-9
		if (str1keta.matches(REG_NUMERIC_AND_LOWER) && str2keta.matches(REG_NUMERIC_AND_LOWER))
		{
			// 戻りはA9
			nextKojiakNo.append("A");
			nextKojiakNo.append(str2keta);
		}
		// 1桁：A-Y、2桁：0-9
		if (str1keta.matches(REG_ALFA_A_Y) && str2keta.matches(REG_NUMERIC_AND_LOWER))
		{
			// 戻りはA9
			nextKojiakNo.append(changeString(str1keta));
			nextKojiakNo.append(str2keta);
		}
		// 1桁：Z、2桁：0-9
		if (str1keta.matches(REG_ALFA_Z) && str2keta.matches(REG_NUMERIC_AND_LOWER))
		{
			// 戻りは9A
			nextKojiakNo.append(mskmshoNo1keta);
			nextKojiakNo.append("A");
			
		}
		// 1桁：0-9、2桁：A-Y
		if (str1keta.matches(REG_NUMERIC_AND_LOWER) && str2keta.matches(REG_ALFA_A_Y))
		{
			// 戻りは9A
			nextKojiakNo.append(str1keta);
			nextKojiakNo.append(changeString(str2keta));
		}
		// 1桁：0-9、2桁：Z
		if (str1keta.matches(REG_NUMERIC_AND_LOWER) && str2keta.matches(REG_ALFA_Z))
		{
			// 戻りはAA
			nextKojiakNo.append("A");
			nextKojiakNo.append("A");
		}
		// 1桁：A-Y、2桁：A-Y
		if (str1keta.matches(REG_ALFA_A_Y) && str2keta.matches(REG_ALFA_A_Y))
		{
			// 戻りはAA or null
			nextKojiakNo.append(str1keta);
			nextKojiakNo.append(changeString(str2keta));
		}
		// 1桁：A-Y、2桁：Z
		if (str1keta.matches(REG_ALFA_A_Y) && str2keta.matches(REG_ALFA_Z))
		{
			// 戻りはAA or null
			nextKojiakNo.append(changeString(str1keta));
			nextKojiakNo.append("A");
		}
		// 1桁：Z、2桁：A-Y
		if (str1keta.matches(REG_ALFA_Z) && str2keta.matches(REG_ALFA_A_Y))
		{
			// 戻りはAA
			nextKojiakNo.append(str1keta);
			nextKojiakNo.append(changeString(str2keta));
		}
		// 1桁：Z、2桁：Z
		if (str1keta.matches(REG_ALFA_Z) && str2keta.matches(REG_ALFA_Z))
		{
			// 戻りは""
			nextKojiakNo = new StringBuffer();
		}
		else
		{
			nextKojiakNo.append(str3keta);
		}
		return nextKojiakNo.toString();
		
	}
	
	/**
	 * 工事案件番号採番用文字置換
	 * @param arg0 置換前文字A〜Z
	 * @return 置換後文字
	 */
	private String changeString(String arg0)
	{
		/** 変換文字列*/
		String[] alfa = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
				"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
		
		String strReturn = null;
		for (int i = 0; i < 26; i++)
		{
			if (alfa[i].equals(arg0))
			{
				if (i < 25)
				{
					strReturn = alfa[i + 1];
					break;
				}
				// Zで呼び出されることはありえない
//				else
//				{
//					strReturn = alfa[0];
//					break;
//				}
			}
		}
		return strReturn;
			
	}
}
