namespace SharpChat.Configuration;

public class ScopedConfig(Config config, string prefix) : Config {
    private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config));
    private string Prefix { get; } = prefix ?? throw new ArgumentNullException(nameof(prefix));

    private string GetName(string name) {
        return Prefix + name;
    }

    public string? ReadValue(string name, string? fallback = null) {
        return Config.ReadValue(GetName(name), fallback);
    }

    public T? ReadValue<T>(string name, T? fallback = default) {
        return Config.ReadValue(GetName(name), fallback);
    }

    public T? SafeReadValue<T>(string name, T? fallback) {
        return Config.SafeReadValue(GetName(name), fallback);
    }

    public Config ScopeTo(string prefix) {
        return Config.ScopeTo(GetName(prefix));
    }

    public CachedValue<T> ReadCached<T>(string name, T? fallback = default, TimeSpan? lifetime = null) {
        return Config.ReadCached(GetName(name), fallback, lifetime);
    }

    public void Dispose() {
        GC.SuppressFinalize(this);
    }
}