/*
 * The MIT License
 *
 * Copyright 2013 Dra0211.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package kinugasa.ui;

import java.util.ArrayList;
import java.util.List;
import kinugasa.contents.resource.Storage;

/**
 * 文字セットのキャッシュデータおよびいくつかのプリセットを保管するストレージです.
 * <br>
 *
 * <br>
 *
 * @author dra0211 ( <a href="mailto:d0211@live.jp">d0211@live.jp</a>&nbsp;).<br>
 * @author Dra0211<br>
 * <br>
 */
public class CharSetStorage extends Storage<CharSet> {

	/** この文字セットは半角小文字のアルファベットを提供します.
	 * アルファベットはaからzで7文字ずつスペースで区切られています。<br>
	 */
	public static final CharSet A_TO_Z_LOW = new CharSet("A_TO_Z_LOW", 1.6f,
			"abcdefg hijklmn opqrstu vwxyz");
	/** この文字セットは半角大文字のアルファベットを提供します.
	 * アルファベットはAからXで7文字ずつスペースで区切られています。<br>
	 */
	public static final CharSet A_TO_Z_UP = new CharSet("A_TO_Z_UP", 1.6f,
			"ABCDEFG HIJKLMN OPQRSTU VWXYZ");
	/** この文字セットは半角の0から9数字までの数字を提供します.
	 * 数字は0...9の順番です。<br>
	 */
	public static final CharSet NUMBER = new CharSet("NUMBER", 1.6f,
			"0123456789                   ");
	/** この文字セットは全角の0から9数字までの数字を提供します.
	 * 数字は0...9の順番です。<br>
	 */
	public static final CharSet DOUBLE_BYTE_NUMBER = new CharSet("DOUBLE_BYTE_NUMBER", 1.0f,
			"０１２３４５６７８９                   ");
	/** この文字セットは半角の0から9数字までの数字をテンキーの配置で提供します.
	 * 数字は789 - 456 - 123 - 0の順番です。<br>
	 */
	public static final CharSet TEN_KEY = new CharSet("TEN_KEY", 1.6f,
			"789\n456\n123\n0");
	/** この文字セットは全角の0から9数字までの数字をテンキーの配置で提供します.
	 * 数字は789 - 456 - 123 - 0の順番です。<br>
	 */
	public static final CharSet DOUBLE_BYTE_TEN_KEY = new CharSet("DOUBLE_BYTE_TEN_KEY", 1.0f,
			"７８９\n４５６\n１２３\n０");
	/** この文字セットは全てのひらがなを提供します. */
	public static final CharSet HIRAGANA = new CharSet("HIRAGANA", 1.0f,
			"あいうえお　かきくけこ　さしすせそ　たちつてと　なにぬねの\n"
			+ "はひふへほ　まみむめも　や　ゆ　よ　らりるれろ　わゐをん　　\n"
			+ "ぁぃぅぇぉ　っ　ゎ　ゃゅょ　ー、。　　　　　　　　　　　　\n"
			+ "がぎぐげご　ざじずぜぞ　だぢづでど　ばびぶべぼ　ぱぴぷぺぽ");
	/** この文字セットはすべての全角のカタカナを提供します. */
	public static final CharSet KATAKANA = new CharSet("KATAKANA", 1.0f,
			"アイウエオ　カキクケコ　サシスセソ　タチツテト　ナニヌネノ\n"
			+ "ハヒフヘホ　マミムメモ　ヤユヨ　ラリルレロ　ワヰヱヲン　　\n"
			+ "ァィゥェォ　ッ　ヮ　ャュョ　ヴ　ー、。　　　　　　　　　　\n"
			+ "ガギグゲゴ　ザジズゼゾ　ダヂヅデド　バビブベボ　パピプペポ");
	/** この文字セットは半角の図形および記号を提供します. */
	public static final CharSet SIGN = new CharSet("BYTE_SIGN", 1.6f,
			" !\"#$%&'() *+,-./:;    \n"
			+ "<=>?@[\\] ^_`{|}~");
	/** この文字セットは全角固有の図形および記号を提供します. */
	public static final CharSet DOUBLE_BYTE_SIGN = new CharSet("DOUBLE_BYTE_SIGN", 1.0f,
			"×・　○△▽◇□☆　●▲▼◆■★");
	private static final long serialVersionUID = -1069168298749770811L;

	/**
	 * シングルトンクラスです.
	 */
	private CharSetStorage() {
		super();
		add(A_TO_Z_LOW);
		add(A_TO_Z_UP);
		add(HIRAGANA);
		add(KATAKANA);
		add(NUMBER);
		add(DOUBLE_BYTE_NUMBER);
		add(SIGN);
		add(DOUBLE_BYTE_SIGN);
		add(TEN_KEY);
		add(DOUBLE_BYTE_TEN_KEY);
	}
	/** このクラスの唯一のインスタンスです. */
	private static final CharSetStorage INSTANCE = new CharSetStorage();

	/**
	 * インスタンスを取得します.
	 *
	 * @return このクラスの唯一のインスタンスを返します。<br>
	 */
	public static CharSetStorage getInstance() {
		return INSTANCE;
	}

	/**
	 * 文字cが含まれている文字セットを検索し、すべて取得します.
	 *
	 * @param c 検索する文字を指定します。<br>
	 *
	 * @return 文字が含まれる文字セットをリストとして返します。発見されなかった場合は空のリストを返します。<br>
	 */
	public List<CharSet> containsChar(char c) {
		return containsChar(Character.toString(c));
	}

	/**
	 * 文字cが含まれている文字セットを検索し、すべて取得します.
	 *
	 * @param str 検索する文字を指定します。<br>
	 *
	 * @return 文字が含まれる文字セットをリストとして返します。発見されなかった場合は空のリストを返します。<br>
	 */
	public List<CharSet> containsChar(String str) {
		List<CharSet> result = new ArrayList<CharSet>(8);
		for (CharSet charSet : getAll()) {
			if (charSet.contains(str)) {
				result.add(charSet);
			}
		}
		return result;
	}
}
