using System;

namespace SharpChat.Config {
    public class ScopedConfig(IConfig config, string prefix) : IConfig {
        private IConfig 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 IConfig 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);
        }
    }
}