package jp.co.y_net.amm.common;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

public class ResourceReader {
    
    private static final String DEFAULT_PROP = "App";

    public static Integer getIntegerQuick(String key) {
        String str = getStringQuick(key);
        try {
            return Integer.parseInt(str);
        } catch (NumberFormatException e) {
            return -1;
        }
    }
    public static boolean getBooleanQuick(String key) {
        String str = getStringQuick(key).toLowerCase();
        return str.equals("yes")
                || str.equals("y")
                || str.equals("true")
                || str.equals("t")
                || str.equals("1");
    }
    
    /**
     * @see #getString(String, String)
     * @param def 値が取得できなかった場合のデフォルト値
     */
    public static final String getStringQuick(String key, String def) {
        String value = getStringQuick(key);
        if(value == null) {
            return def;
        } else {
            return value;
        }
    }
    /**
     * 値の変更でサーバーの再起動を必要としない、プロパティファイルの読み取り機能
     * ・読み取り対象は jp.co.y_net.amm.WicketApplication.properties.properties とする。
     * ・キャッシュの持続時間は 60 秒とする。
     * @param key 
     * @return
     */
    public static final String getStringQuick(String key) {
        String value = null;
        try {
            ResourceBundle bundle = ResourceBundle.getBundle(DEFAULT_PROP, RESOURCE_BUNDLE_CONTROL);
            value = bundle.getString(key);
            
        } catch (Exception e) {
            AppLogger.info(DEFAULT_PROP + ".properties から[" + key + "]が取得できませんでした。");
        }
        return value;
    }
    private static final ResourceBundle.Control RESOURCE_BUNDLE_CONTROL = new ResourceBundle.Control() {
        public long getTimeToLive(String baseName, Locale locale) {
            return 60000L;
        }
    };
    
    
    /**
     * プロパティファイルの全行をリストで取得
     * @param resourceName 
     * @return
     */
    public static List<String> getLines(String resourceName) {
        Enumeration<String> keys;
        try {
            ResourceBundle bundle = ResourceBundle.getBundle(resourceName, RESOURCE_BUNDLE_CONTROL);
            keys = bundle.getKeys();
            
        } catch (Exception e) {
            AppLogger.info(DEFAULT_PROP + ".properties が参照できませんでした。");
            return new ArrayList<String>();
        }
        List<String> lines = new ArrayList<String>();
        while(keys.hasMoreElements()) {
            lines.add(keys.nextElement());
        }
        return lines;
    }
    
//    /**
//     * getString はアプリケーションが稼働しているスレッドからでないと使用できない。
//     * 単体テストやアプリケーションの配下でないところからプロパティファイルを参照する際に使用する。
//     * @param key 
//     * @return 
//     */
//    public static final String getStringWithoutApp(String key) {
//        String value = null;
//        try {
//            ResourceBundle bundle = ResourceBundle.getBundle(DEFAULT_PROP);
//            value = bundle.getString(key);
//        } catch (Exception e) {
//            AppLogger.info(DEFAULT_PROP + "から[" + key + "]が取得できませんでした。");
//        }
//        return value;
//    }

    
    /**
     * クラスパス上のリソースからテキストファイルとして読み込む
     * @param name 相対パス指定は不可
     * @return
     */
    public static String getText(String name) {
        StringBuilder sb = new StringBuilder();
        InputStream is = null;
        InputStreamReader isr = null;
        try {
            /* mainメソッドからの呼び出しを想定 */
            is =  ClassLoader.getSystemResourceAsStream(name);
            if(is==null) {
                /* webアプリケーションからの呼び出しを想定 */
                is =  ResourceReader.class.getResourceAsStream("/" + name);
            }
            if(is==null) {
                AppLogger.info(name + "が取得できませんでした。");
            }
            isr = new InputStreamReader(is, Charset.forName("UTF-8"));
            int contents;
            while ((contents = isr.read()) != -1) {
                sb.append((char)contents);
//                text += (char)contents;
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (isr != null) isr.close();
                if (is != null) is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        String text = sb.toString();
        return text;
    }


    /**
     * @deprecated プロパティファイルの参照は ResourceReader へ移行しました。
     */
    public static class QuickeProperty extends ResourceReader {
        
    }
    
}
