package eu.mrneznamy.mrultimatelibrary.config;

import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.util.List;
import java.util.Set;

/**
 * A double-sided compatibility bridge between flat and nested configurations.
 * Wraps an existing FileConfiguration and automatically routes calls targeting 
 * nested paths (like "MrPlugin.Settings.Prefix") to flat paths (like "Settings.Prefix"),
 * and vice versa.
 */
public class MrLibWrappedConfig extends YamlConfiguration {
    
    private final String pluginName;
    private final FileConfiguration original;
    
    public MrLibWrappedConfig(String pluginName, FileConfiguration original) {
        this.pluginName = pluginName;
        this.original = original;
        if (original != null) {
            if (original.getDefaults() != null) {
                this.setDefaults(original.getDefaults());
            }
            this.options().copyDefaults(original.options().copyDefaults());
        }
    }
    
    private String resolvePath(String path) {
        if (original == null || path == null) return path;
        
        
        if ("MrUltimateJobs".equalsIgnoreCase(pluginName)) {
            if (path.equalsIgnoreCase("MrUltimateJobs.Settings.Disabled-Worlds")) {
                return "MrUltimateJobs.Config.DisabledWorlds.Worlds";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Jobs-System.Max-Jobs-Per-Player")) {
                return "MrUltimateJobs.Config.Limits.MaxJobs";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Economy.Current-Economy")) {
                return "MrUltimateJobs.Config.Economy.CurrentProvider";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Auto-Join.Enabled")) {
                return "MrUltimateJobs.Config.AutoJobJoin.Enabled";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Auto-Join.Jobs")) {
                return "MrUltimateJobs.Config.AutoJobJoin.Jobs";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Tournaments.Enabled")) {
                return "MrUltimateJobs.Config.Tournaments.Enabled";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Tournaments.Min-Players")) {
                return "MrUltimateJobs.Config.Tournaments.Min-Players";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Tournaments.Max-Players")) {
                return "MrUltimateJobs.Config.Tournaments.Max-Players";
            }
            if (path.equalsIgnoreCase("MrUltimateJobs.Events.Enabled") || path.equalsIgnoreCase("Events.Enabled")) {
                return "MrUltimateJobs.Config.Events.Enabled";
            }
        }
        
        if (original.contains(path)) return path;
        
        
        
        
        String[] prefixes = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String prefix : prefixes) {
            if (path.startsWith(prefix)) {
                String flatPath = path.substring(prefix.length());
                if (original.contains(flatPath)) {
                    return flatPath;
                }
            }
        }
        
        
        
        
        for (String prefix : prefixes) {
            String nestedPath = prefix + path;
            if (original.contains(nestedPath)) {
                return nestedPath;
            }
        }
        
        return path;
    }

    
    @Override
    public Object get(String path) {
        return original != null ? original.get(resolvePath(path)) : null;
    }
    
    @Override
    public Object get(String path, Object def) {
        return original != null ? original.get(resolvePath(path), def) : def;
    }
    
    @Override
    public String getString(String path) {
        return original != null ? original.getString(resolvePath(path)) : null;
    }
    
    @Override
    public String getString(String path, String def) {
        return original != null ? original.getString(resolvePath(path), def) : def;
    }
    
    @Override
    public int getInt(String path) {
        return original != null ? original.getInt(resolvePath(path)) : 0;
    }
    
    @Override
    public int getInt(String path, int def) {
        return original != null ? original.getInt(resolvePath(path), def) : def;
    }
    
    @Override
    public double getDouble(String path) {
        return original != null ? original.getDouble(resolvePath(path)) : 0.0;
    }
    
    @Override
    public double getDouble(String path, double def) {
        return original != null ? original.getDouble(resolvePath(path), def) : def;
    }
    
    @Override
    public boolean getBoolean(String path) {
        return original != null ? original.getBoolean(resolvePath(path)) : false;
    }
    
    @Override
    public boolean getBoolean(String path, boolean def) {
        return original != null ? original.getBoolean(resolvePath(path), def) : def;
    }
    
    @Override
    public List<String> getStringList(String path) {
        return original != null ? original.getStringList(resolvePath(path)) : new java.util.ArrayList<>();
    }
    
    @Override
    public ConfigurationSection getConfigurationSection(String path) {
        if (original == null) return null;
        String resolved = resolvePath(path);
        return original.getConfigurationSection(resolved);
    }
    
    @Override
    public boolean contains(String path) {
        if (original == null) return false;
        if (original.contains(path)) return true;
        
        String[] prefixes = {pluginName + ".", pluginName + ".config.", pluginName + ".Config."};
        for (String prefix : prefixes) {
            if (path.startsWith(prefix)) {
                if (original.contains(path.substring(prefix.length()))) return true;
            } else {
                if (original.contains(prefix + path)) return true;
            }
        }
        return false;
    }

    @Override
    public Set<String> getKeys(boolean deep) {
        return original != null ? original.getKeys(deep) : new java.util.HashSet<>();
    }

    @Override
    public void set(String path, Object val) {
        super.set(path, val);
        if (original != null) {
            original.set(resolvePath(path), val);
        }
    }

    @Override
    public void save(java.io.File file) throws java.io.IOException {
        if (original != null) {
            original.save(file);
        } else {
            super.save(file);
        }
    }

    @Override
    public void save(String file) throws java.io.IOException {
        if (original != null) {
            original.save(file);
        } else {
            super.save(file);
        }
    }

    @Override
    public String saveToString() {
        if (original != null) {
            return original.saveToString();
        }
        return super.saveToString();
    }
}
