package cc.util.bossshop.config;

import java.util.Map;

import org.apache.commons.lang.Validate;
import org.bukkit.configuration.Configuration;

/**
 * 
 * 支持注释的配置管理器
 *
 */
public class CommentedConfiguration extends CommentedSection implements Configuration{

    protected CommentedConfiguration mDefaults;
    protected CommentedOptions mOptions;

    
    public CommentedConfiguration(){}

    /**
     * 为节点添加一个默认值,如果值不存在,将会直接设置到配置其中
     */
    @Override
    public void addDefault(String pPath,Object pValue){
        Validate.notNull(pPath,"Path may not be null");
        if(mDefaults==null){
            mDefaults=new CommentedConfiguration();
        }
        if(!this.contains(pPath)) this.set(pPath,pValue);
        else mDefaults.set(pPath,pValue);
    }
    
    public void addDefault(String pPath,Object pValue,String...pComments){
        this.addDefault(pPath,pValue);
        this.addDefaultComments(pPath,pComments);
    }

    @Override
    public void addDefaults(Map<String,Object> pDefaults){
        Validate.notNull(pDefaults,"默认配置不能为空");

        for(Map.Entry<String,Object> entry : pDefaults.entrySet()){
            this.addDefault(entry.getKey(),entry.getValue());
        }
    }

    @Override
    public void addDefaults(Configuration pDefaults){
        Validate.notNull(pDefaults,"默认配置不能为空");
        this.addDefaults(pDefaults.getValues(true));
    }

    @Override
    public void setDefaults(Configuration pDefaults){
        if(pDefaults instanceof CommentedConfiguration){
            this.mDefaults=(CommentedConfiguration)pDefaults;
        }else{
            this.addDefaults(pDefaults.getValues(true));
        }
    }

    @Override
    public CommentedConfiguration getDefaults(){
        return this.mDefaults;
    }

    @Override
    public CommentedSection getParent(){
        return null;
    }

    @Override
    public CommentedOptions options(){
        if(mOptions==null){
            mOptions=new CommentedOptions(this);
        }
        return mOptions;
    }

    /**
     * 设置输入路径的分割用字符,默认为"."
     * @param value 作为分割路径用的字符
     */
    public void pathSeparator(char value){
        this.options().pathSeparator(value);
    }

    /**
     * 获取路径分割用字符
     * @return 分割路径用的字符
     */
    public char pathSeparator(){
        return this.options().pathSeparator();
    }
}
