namespace SharpChat.Configuration {
    public interface Config : IDisposable {
        /// <summary>
        /// Creates a proxy object that forces all names to start with the given prefix.
        /// </summary>
        Config ScopeTo(string prefix);

        /// <summary>
        /// Reads a raw (string) value from the config.
        /// </summary>
        string? ReadValue(string name, string? fallback = null);

        /// <summary>
        /// Reads and casts value from the config.
        /// </summary>
        /// <exception cref="ConfigTypeException">Type conversion failed.</exception>
        T? ReadValue<T>(string name, T? fallback = default);

        /// <summary>
        /// Reads and casts a value from the config. Returns fallback when type conversion fails.
        /// </summary>
        T? SafeReadValue<T>(string name, T? fallback);

        /// <summary>
        /// Creates an object that caches the read value for a certain amount of time, avoiding disk reads for frequently used non-static values.
        /// </summary>
        CachedValue<T> ReadCached<T>(string name, T? fallback = default, TimeSpan? lifetime = null);
    }
}