/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * (c) Copyright 2002 by Tsukuba Bunko.
 *
 * $Id: MessageID.java,v 1.1.2.1 2003/12/11 10:09:11 ppoi Exp $
 */
package tsukuba_bunko.peko;

import	java.text.MessageFormat;

import	tsukuba_bunko.peko.resource.ResourceManager;


/**
 * メッセージ ID です。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class MessageID	{

	/**
	 * メッセージリソースの prefix
	 */
	public static final String	RID_PREFIX = "peko.message.";

	/**
	 * 出力メッセージのテンプレート / {0}:メッセージ ID {1}:メッセージ
	 */
	protected static final MessageFormat	TEMPLATE_MESSAGE = new MessageFormat( "[{0}] {1}" );

	/**
	 * メッセージリソースが存在しない場合のメッセージ
	 */
	protected static final String	NULL_MESSAGE = "********** NO MESSAGE **********";


	/**
	 * メッセージ ID
	 */
	private String	_messageID = null;

	/**
	 * デフォルトのメッセージ
	 */
	private Object	_defaultMessage = null;


	/**
	 * <code>MessageID</code> のインスタンスを生成します。
	 * @param	messageID	メッセージ ID
	 */
	public MessageID( String messageID )
	{
		this( messageID, "***** message missing *****" );
	}

	/**
	 * <code>MessageID</code> のインスタンスを生成します。
	 * @param	messageID	メッセージ ID
	 * @param	defaultMessage	デフォルトのメッセージ
	 */
	public MessageID( String messageID, Object defaultMessage )
	{
		super();
		_messageID = messageID;
		_defaultMessage = defaultMessage;
	}


	/**
	 * メッセージ ID を取得します。
	 * @return	メッセージ ID
	 */
	public String getMessageID()
	{
		return _messageID;
	}

	/**
	 * メッセージを取得します。
	 * @return	メッセージ文字列
	 */
	public String getMessage()
	{
		ResourceManager	resources = ResourceManager.getInstance();
		Object	message = null;
		if( _defaultMessage == null )	{
			message = resources.getResource( MessageID.RID_PREFIX + _messageID );
			if( message == null )	{
				message = MessageID.NULL_MESSAGE;
			}
		}
		else	{
			message = resources.getResource( MessageID.RID_PREFIX + _messageID, true );
			if( message == null )	{
				message = _defaultMessage;
			}
		}

		String	messageStr = null;
		if( message instanceof String )	{
			messageStr = (String)message;
		}
		else	{
			messageStr = message.toString();
		}

		return MessageID.TEMPLATE_MESSAGE.format( new Object[]{_messageID, messageStr} );
	}

	/**
	 * メッセージを取得します。
	 * @param	params	メッセージに埋め込むパラメータ
	 * @return	メッセージ文字列
	 */
	public String getMessage( Object[] params )
	{
		ResourceManager	resources = ResourceManager.getInstance();
		Object	message = null;
		if( _defaultMessage == null )	{
			message = resources.getResource( MessageID.RID_PREFIX + _messageID );
			if( message == null )	{
				message = MessageID.NULL_MESSAGE;
			}
		}
		else	{
			message = resources.getResource( MessageID.RID_PREFIX + _messageID, true );
			if( message == null )	{
				message = _defaultMessage;
			}
		}

		String	messageStr = null;
		if( message instanceof MessageFormat )	{
			messageStr = ((MessageFormat)message).format( params );
		}
		else if( message instanceof String )	{
			messageStr = MessageFormat.format( (String)message, params );
		}
		else	{
			messageStr = message.toString();
		}

		return MessageID.TEMPLATE_MESSAGE.format( new Object[]{_messageID, messageStr} );
	}


//
//	Object の実装
//
	public String toString()
	{
		return _messageID;
	}

	public int hashCode()
	{
		return _messageID.hashCode();
	}

	public boolean equals( Object obj )
	{
		if( obj instanceof MessageID )	{
			return _messageID.equals( ((MessageID)obj)._messageID );
		}
		else	{
			return false;
		}
	}
}