using System;
using System.Configuration;
using System.Linq;
using Serilog;
using Serilog.Configuration;

namespace Serilog
{
    internal class AppSettingsSettings : ILoggerSettings
    {
        readonly string SettingPrefix;

        public AppSettingsSettings(string settingPrefix)
        {
            SettingPrefix = string.Format("{0}:", settingPrefix);
        }

        public void Configure(LoggerConfiguration loggerConfiguration)
        {
            if (loggerConfiguration == null)
            {
                throw new ArgumentNullException("loggerConfiguration");
            }

            var settings = ConfigurationManager.AppSettings;

            var pairs = settings.AllKeys
                .Where(k => k.StartsWith(SettingPrefix))
                .ToDictionary(k => k.Substring(SettingPrefix.Length), k => Environment.ExpandEnvironmentVariables(settings[k]));

            // Add the FullNetFx assembly by default so that all built-in Serilog sinks are available without "using"
            pairs.Add("using:_ImpliedSerilogFullNetFx", typeof(AppSettingsSettings).Assembly.FullName);

            loggerConfiguration.ReadFrom.KeyValuePairs(pairs);
        }
    }
}