package jp.co.y_net.amm.service;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jp.co.y_net.amm.dao.Localestring;
import jp.co.y_net.amm.dao.LocalestringDao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

/**
 * LocaleString : 表示文字列の管理
 * 
 * データベースのテーブル「localestring」から表示文字情報を取得する。
 * 2014/07/16 速度改善のため、キャッシュの仕組みを追加 K.Inaba
 * 
 * @version 1.0.0
 * @author y.soga
 */
@Component("localeStringSearch")
public class LocaleStringSearch implements Serializable {
	private static final long serialVersionUID = 7151445795383658463L;

    @Autowired(required = true)
    @Qualifier("localestringDao")
    private LocalestringDao localestringDao;
    
    /**
     * 表示文字列をキャッシュするためのオブジェクト
     */
    private Map<String, String> strCash = new HashMap<String, String>();
    
    /**
     * キャッシュをクリアする処理。
     * DashboardPageより呼び出されることを想定
     */
    public void clearCash() {
        strCash = new HashMap<String, String>();
    }
    /** キャッシュサイズを返す */
    public int getCashCount() {
        int size = strCash.keySet().size();
        return size;
    }

    /**
     * 画面ID、コントロールID、言語ID、メッセージ番号 に一致する表示文字情報を 1件取得する
     * @version 1.0.0
     * @author y.soga
     * @param screenId 画面ID
     * @param controlId コントロールID
     * @param languageId 言語ID
     * @param String num メッセージ番具御
     * @return String 表示文字情報（1件）
     */
    public String getDisplayString(String screenId, String controlId, Integer languageId, String num) {

        String key = createKey("lcl", screenId, controlId, String.valueOf(languageId), num);

        if (strCash.get(key) == null) { // キャッシュに無ければDBから取得する
            Localestring ls = new Localestring();
            ls.setScreenid(screenId);
            ls.setControlid(controlId);
            ls.setLanguageid(languageId);
            ls.setNum(num);
            
            if(localestringDao == null) {
                return "***";
            }
            List<Localestring> results = localestringDao.get(ls);
            String strRet;
            if (results.size() > 0) {
                strRet = results.get(0).getPrintstring();
            } else {
                /* 2015/04/25 "CM000"の取得を試みる */
                ls.setScreenid("CM000");
                results = localestringDao.get(ls);
                if (results.size() > 0) {
                    strRet = results.get(0).getPrintstring();
                } else {
                    strRet = "";
                }
            }
            /* キャッシュに登録 */
            strCash.put(key, strRet);
        } else {
            // キャッシュにあれば処理なし。
        }
        return strCash.get(key);
    }
    /**
     * キャッシュのキーを生成するメソッド
     * 書式：　lcl$画面ID$コントロールID$言語ID$メッセージ番号
     * 書式（コントロールID、メッセージ番号が無い場合）：　lcl$画面ID$$言語ID$
     * @param type 表示文字情報の場合は "lcl"
     * @param screenId 画面ID
     * @param controlId コントロールID
     * @param languageId 言語ID
     * @param num メッセージ番号
     * @return 上記を連結したキー
     */
    private static String createKey(String type, String screenId, String controlId, String languageId, String num) {
        return type + "$" + screenId + "$" + controlId + "$" + languageId + "$" + num;
    }
}
