using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Configuration.FileExtensions;
using Microsoft.Extensions.Configuration.EnvironmentVariables;
using Microsoft.Extensions.Configuration.Memory;
using Microsoft.Extensions.Configuration.Binder;
using Microsoft.Extensions.Configuration.CommandLine;
using Microsoft.Extensions.Configuration.Ini;
using Microsoft.Extensions.Configuration.Xml;
using Microsoft.Extensions.Configuration.UserSecrets;

namespace Study.XUnitTest
{
    /// <summary>
    /// ConfigurationProvider 使用学习
    /// Microsoft.Extensions.Configuration 可用Nuget获取
    /// InMemoryConfigurationProvider
    /// 适用于 Config.json 的 JsonFileConfigurationProvider
    /// 适用于 Config.Production.json 的 JsonFileConfigurationProvider
    /// EnvironmentVariableConfigurationProvider
    /// CommandLineConfigurationProvider
    /// </summary>
    /// <example>https://msdn.microsoft.com/magazine/mt632279</example>
    /// <example>https://www.cnblogs.com/artech/p/asp-net-core-config-4-1.html</example>
    public class CustomProviderStudy
    {

        public IConfiguration ConfigurationFromDictionary()
        {
            Dictionary<string, string> source = new Dictionary<string, string>
            {
                ["LongDatePattern"] = "dddd, MMMM d, yyyy",
                ["LongTimePattern"] = "h:mm:ss tt",
                ["ShortDatePattern"] = "M/d/yyyy",
                ["ShortTimePattern"] = "h:mm tt"
            };
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddInMemoryCollection(GetDictionary());
            var  configuration = configurationBuilder.Build();
            return configuration;
        }

        public IConfiguration BuildConfigurationFromInMemoryCollection()
        {
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

            // 添加默认连接 内存中.NET对象
            configurationBuilder.AddInMemoryCollection(GetDictionary());
            IConfiguration configuration = configurationBuilder.Build();

            return configuration;
        }

        public IConfiguration BuildProviderFromObject()
        {
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder
                .AddInMemoryCollection(GetDictionary())
                .AddJsonFile("Config.json", true)
                .AddEnvironmentVariables("EssentialDotNetConfiguration")
                .AddIniFile("", true, true)
                .AddXmlFile("", true, true)
                .AddCommandLine(new string[]{"1","2"});
            return configurationBuilder.Build();
        }

        public IConfigurationProvider BuildProviderFromXml()
        {
           
            return null;
        }

        public IConfiguration BuildProviderFromIni()
        {
            return null;
        }

        public IConfiguration BuildProviderFromAppCOnfig()
        {
            return null;
        }

        public IConfiguration BuildProviderFromJson()
        {
            JsonConfigurationSource source = new JsonConfigurationSource();
            source.Path = "App.json";
            JsonConfigurationProvider jsonConfigurationProvider = new JsonConfigurationProvider(source);
            jsonConfigurationProvider.Load();
            return null;
        }

        public IConfiguration BuildProviderFromAppJson()
        {
            return null;
        }

        /// <summary>
        /// 字典
        /// </summary>
        private static IReadOnlyDictionary<string, string> GetDictionary()
        {
            IReadOnlyDictionary<string, string> DefaultConfigurationStrings =
                new Dictionary<string, string>()
                {
                    ["Profile:UserName"] = Environment.UserName,
                    [$"AppConfiguration:ConnectionString"] = GetDefaultionString(),
                    [$"AppConfiguration:MainWindow:Height"] = "400",
                    [$"AppConfiguration:MainWindow:Width"] = "600",
                    [$"AppConfiguration:MainWindow:Top"] = "0",
                    [$"AppConfiguration:MainWindow:Left"] = "0",
                };

            return DefaultConfigurationStrings;
        }

        /// <summary>
        /// MsSQL连接字串
        /// </summary>
        private static string GetDefaultionString()
        {
            return @"Server = (localdb)\\mssqllocaldb; Database = SampleData; Trusted_Connection = True; MultipleActiveResultSets = true";
        }
    }
}