package com.daipresents.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;

public class AbstractProperties {

    private Properties properties;
    
    private Map<String, List<String>> listMap;
    
    private Map<String, Map<String, String>> mapMap;
    
    private AbstractProperties() {
        // TODO 自動生成されたコンストラクター・スタブ
    }
    
    protected AbstractProperties(String filePath) throws IOException{
        this.listMap = new HashMap<String, List<String>>();
        this.mapMap = new HashMap<String, Map<String, String>>();
        this.properties = new Properties();
        this.properties.loadFromXML(new FileInputStream(filePath));
    }
    
    public int getIntValue(String key){
        return Integer.parseInt(properties.getProperty(key));
    }
    
    public long getLongValue(String key){
        return Long.parseLong(properties.getProperty(key));
    }
    
    public float getFloatValue(String key){
        return Float.parseFloat(properties.getProperty(key));
    }
    
    public double getDoubleValue(String key){
        return Double.parseDouble(properties.getProperty(key));
    }
    
    public boolean getBooleanValue(String key){
        return Boolean.parseBoolean(properties.getProperty(key));
    }
    
    public String getStringValue(String key){
        return properties.getProperty(key);
    }
    
    public List<String> getListValue(String key){
        
        List<String> value = this.listMap.get(key);
        if(value != null){
            return value;
        }
        
        //存在しない場合はListを生成する
        List<String> createList =  splitString(properties.getProperty(key), ",");
        this.listMap.put(key, createList);
        
        return createList;
    }
    
    public Map<String, String> getMapValue(String key){
        
        Map<String, String> value = this.mapMap.get(key);
        if(value != null){
            return value;
        }
        
        //存在しない場合はMapを生成する
        Map<String, String> createMap = convertToMap(properties.getProperty(key));
        this.mapMap.put(key, createMap);
        return createMap;
    }
    
    public List<String> splitString(String str, String regex){
        
        if(str == null || "".equals(str)){
            return null;
        }
        
        List<String> list = new ArrayList<String>();
        
        StringTokenizer t = new StringTokenizer(str, ",", false);
        while(t.hasMoreTokens()){
            list.add(t.nextToken());
        }
        
        if(list.isEmpty()){
            return null;
        }
        
        return list;
    }
    
    public Map<String, String> convertToMap(String str){
        
        //key=valueの場合のみMapに追加する
        
        List<String> list = splitString(str, ",");
        
        if(list == null){
            return null;
        }
        
        Map<String, String> map = new HashMap<String, String>();
        
        for(String mapString : list){
            if(mapString == null || "".equals(mapString)){
                continue;
            }
            if(mapString.startsWith("=")){
                //keyがない場合はMapに追加しない
                continue;
            }
            
            if(mapString.indexOf("=") != -1){
                String[] mapArray = mapString.split("=");
                
                if(mapArray.length == 1){
                    //key=の場合はvalueがnull
                    map.put(mapArray[0], null);
                    
                }else{
                    map.put(mapArray[0], mapArray[1]);
                }
            }
            
        }
        
        if(map.isEmpty()){
            return null;
        }
        
        return map;
    }
}

