using System.Diagnostics;

using HttpClientStudy.Core.Utilities;

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;

//集成 asp.net core 引用 TestHost(3.0+)
using Microsoft.AspNetCore.TestHost;

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

using Serilog;

using Xunit;
using Xunit.DependencyInjection;

//如果使用最小API,则引用
using Xunit.DependencyInjection.AspNetCoreTesting;

using Xunit.DependencyInjection.Logging;

namespace HttpClientStudy.UnitTest
{
    /// <summary>
    /// 依赖注入框架:Xunit.DependencyInjection, 必备设置类
    /// </summary>
    public class Startup
    {
        /// <summary>
        /// 创建主机:可选,一般不用
        /// </summary>
        /// <returns></returns>
        public IHostBuilder CreateHostBuilder()
        {
            return Host.CreateDefaultBuilder();
        }

        /// <summary>
        /// 配置主机:可选(集成Asp.Net Core时,配置主机)
        /// </summary>
        /// <param name="hostBuilder"></param>
        public void ConfigureHost(IHostBuilder hostBuilder)
        {
            //确保启动 webapi 项目
            StartupUtility.StartWebApiProject();

            hostBuilder
                //主机配置设置
                .ConfigureHostConfiguration(builder =>
                {

                })
                //应用配置设置
                .ConfigureAppConfiguration((context, builder) =>
                {
                    
                })
                //配置Web主机
                .ConfigureWebHost(webHostBuilder =>
                {
                    webHostBuilder
                        //测试主机,集成测试使用
                        .UseTestServer(options => 
                        { 
                            options.PreserveExecutionContext = true; 
                        })
                        .ConfigureTestServices(services => 
                        {
                            services.AddSerilog((services, loggerConfiguration) =>
                            {
                                loggerConfiguration
                                .WriteTo.File("logs\\log.txt", rollingInterval: RollingInterval.Day)
                                .WriteTo.Console();
                            });
                        })
                        .UseStartup<WebApiStartup>()
                        ;
                });
        }

        /// <summary>
        /// 注册服务:必须
        /// </summary>
        /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services, HostBuilderContext context)
        {
            services.BuildServiceProvider().GetRequiredService<IHostApplicationLifetime>().ApplicationStopping.Register(() =>
            {
                
            });
        }

        private class WebApiStartup
        {
            public void ConfigureServices(IServiceCollection services) 
            {
                services.AddLogging(lb => lb.AddXunitOutput());
            }

            public void Configure(IApplicationBuilder app)
            {
               
            }
        }
    }
}