package eu.mrneznamy.mrultimatelibrary.config;

import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.List;

/**
 * Utility to read configuration values from both new flat format and old nested format.
 */
public class MrLibConfigReader {
    
    private final String pluginName;
    private final FileConfiguration config;
    
    public MrLibConfigReader(String pluginName, FileConfiguration config) {
        this.pluginName = pluginName;
        this.config = config;
    }
    
    public String getString(String path) {
        return getString(path, null);
    }
    
    public String getString(String path, String def) {
        if (config.contains(path) && !config.isConfigurationSection(path)) return config.getString(path, def);
        
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.contains(root + path)) return config.getString(root + path, def);
        }
        
        return def;
    }
    
    public int getInt(String path, int def) {
        if (config.contains(path) && !config.isConfigurationSection(path)) return config.getInt(path, def);
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.contains(root + path)) return config.getInt(root + path, def);
        }
        
        return def;
    }
    
    public boolean getBoolean(String path, boolean def) {
        if (config.contains(path) && !config.isConfigurationSection(path)) return config.getBoolean(path, def);
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.contains(root + path)) return config.getBoolean(root + path, def);
        }
        
        return def;
    }
    
    public double getDouble(String path, double def) {
        if (config.contains(path) && !config.isConfigurationSection(path)) return config.getDouble(path, def);
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.contains(root + path)) return config.getDouble(root + path, def);
        }
        
        return def;
    }
    
    public List<String> getStringList(String path) {
        if (config.contains(path) && !config.isConfigurationSection(path)) return config.getStringList(path);
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.contains(root + path)) return config.getStringList(root + path);
        }
        
        return config.getStringList(path);
    }
    
    public ConfigurationSection getConfigurationSection(String path) {
        if (path == null || path.isEmpty()) {
            if (config.isConfigurationSection(pluginName)) return config.getConfigurationSection(pluginName);
            String[] roots = {pluginName + ".config", pluginName + ".Config"};
            for (String root : roots) {
                if (config.isConfigurationSection(root)) return config.getConfigurationSection(root);
            }
            return config;
        }
        
        if (config.isConfigurationSection(path)) return config.getConfigurationSection(path);
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.isConfigurationSection(root + path)) return config.getConfigurationSection(root + path);
        }
        
        return null;
    }
    
    public ConfigurationSection getSection(String path) {
        return getConfigurationSection(path);
    }
    
    public boolean contains(String path) {
        if (config.contains(path)) return true;
        
        String[] roots = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String root : roots) {
            if (config.contains(root + path)) return true;
        }
        
        return false;
    }
}
