/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.lang;

/**
 * iモード絵文字に関するユーティリティクラスです。<p>
 * 
 * @author 杉澤 浩二
 */
public final class ImodeEmojiUtils {

	/**
	 * インスタンス化できない事を強制します。<p>
	 */
	private ImodeEmojiUtils() {}

	/**
	 * 指定された文字がiモード基本絵文字かどうかを返します。<p>
	 * 
	 * @param c 文字
	 * @return iモード基本絵文字の場合 true を、それ以外の場合 false を返します。
	 */
	public static boolean isStandardEmoji(final char c) {
		return (c >= 0xE63E && c <= 0xE70B);
	}

	/**
	 * 指定された文字がiモード拡張絵文字かどうかを返します。<p>
	 * 
	 * @param c 文字
	 * @return iモード拡張絵文字の場合 true を、それ以外の場合 false を返します。
	 */
	public static boolean isExtendedEmoji(final char c) {
		return (c >= 0xE70C && c <= 0xE757);
	}

	/**
	 * 指定された文字がiモード絵文字かどうかを返します。<p>
	 * 
	 * @param c 文字
	 * @return iモード絵文字の場合 true を、それ以外の場合 false を返します。
	 */
	public static boolean isEmoji(final char c) {
		return isStandardEmoji(c) || isExtendedEmoji(c);
	}

	/**
	 * 指定された文字列中にiモード基本絵文字が存在するかどうかを返します。<p>
	 * 
	 * @param s 文字列
	 * @return iモード基本絵文字が存在する場合 true を、それ以外の場合 false を返します。
	 */
	public static boolean isStandardEmoji(final String s) {
		if (s == null)
			return false;

		for (int i = 0; i < s.length(); i++) {
			if (isStandardEmoji(s.charAt(i)))
				return true;
		}

		return false;
	}

	/**
	 * 指定された文字列中にiモード拡張絵文字が存在するかどうかを返します。<p>
	 * 
	 * @param s 文字列
	 * @return iモード拡張絵文字が存在する場合 true を、それ以外の場合 false を返します。
	 */
	public static boolean isExtendedEmoji(final String s) {
		if (s == null)
			return false;

		for (int i = 0; i < s.length(); i++) {
			if (isExtendedEmoji(s.charAt(i)))
				return true;
		}

		return false;
	}

	/**
	 * 指定された文字列中にiモード絵文字が存在するかどうかを返します。<p>
	 * 
	 * @param s 文字列
	 * @return 絵文字が存在する場合 true を、それ以外の場合 false を返します。
	 */
	public static boolean isEmoji(final String s) {
		if (s == null)
			return false;

		for (int i = 0; i < s.length(); i++) {
			if (isEmoji(s.charAt(i)))
				return true;
		}

		return false;
	}

	/**
	 * 指定された文字列からiモード基本絵文字を削除して返します。<p>
	 * 指定された文字列が <code>null</code> の場合は、<code>null</code> を返します。
	 * 
	 * @param s 文字列
	 * @return iモード基本絵文字が削除された文字列。又は null
	 */
	public static String removeStandardEmoji(final String s) {
		if (s == null)
			return null;

		StringBuilder result = new StringBuilder(s.length());

		for (int i = 0; i < s.length(); i++) {
			final char c = s.charAt(i);
			if (!isStandardEmoji(c))
				result.append(c);
		}

		return result.toString();
	}

	/**
	 * 指定された文字列からiモード拡張絵文字を削除して返します。<p>
	 * 指定された文字列が <code>null</code> の場合は、<code>null</code> を返します。
	 * 
	 * @param s 文字列
	 * @return iモード拡張絵文字が削除された文字列。又は null
	 */
	public static String removeExtendedEmoji(final String s) {
		if (s == null)
			return null;

		StringBuilder result = new StringBuilder(s.length());

		for (int i = 0; i < s.length(); i++) {
			final char c = s.charAt(i);
			if (!isExtendedEmoji(c))
				result.append(c);
		}

		return result.toString();
	}

	/**
	 * 指定された文字列からiモード絵文字を削除して返します。<p>
	 * 指定された文字列が <code>null</code> の場合は、<code>null</code> を返します。
	 * 
	 * @param s 文字列
	 * @return iモード絵文字が削除された文字列。又は null
	 */
	public static String removeEmoji(final String s) {
		if (s == null)
			return null;

		StringBuilder result = new StringBuilder(s.length());

		for (int i = 0; i < s.length(); i++) {
			final char c = s.charAt(i);
			if (!isEmoji(c))
				result.append(c);
		}

		return result.toString();
	}

	/**
	 * 指定されたアクセスキーに対応する絵文字を返します。<p>
	 * 対応する絵文字が存在しない場合は、<code>null</code> を返します。
	 * 
	 * @param c アクセスキー(0〜9、#、*)
	 * @return アクセスキーに対応する絵文字
	 */
	public static String renderAccesskeyEmoji(final char c) {
		switch (c) {
			case '1':
				return "\uE6E2";
			case '2':
				return "\uE6E3";
			case '3':
				return "\uE6E4";
			case '4':
				return "\uE6E5";
			case '5':
				return "\uE6E6";
			case '6':
				return "\uE6E7";
			case '7':
				return "\uE6E8";
			case '8':
				return "\uE6E9";
			case '9':
				return "\uE6EA";
			case '0':
				return "\uE6EB";
			case '#':
				return "\uE6E0";
			case '*':
				return "＊";
			default:
				return null;
		}
	}

}
