using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;

using Swashbuckle;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI;


using SwaggerStudy.Services;

namespace SwaggerStudy
{
    /// <summary>
    /// 启用xml注释
    /// 1、打开项目文件xx.csproj,PropertyGroup节点内添加
    ///    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    ///    <NoWarn>$(NoWarn);1591</NoWarn>
    /// 2、Startup.cs的ConfigureServices方法中的services.AddSwaggerGen里,用setup.IncludeXmlComments()所有项目xml注释文件
    /// 3、WebApi方法与控制器中,使用xml注释
    /// 4、重新编译后使用
    /// </summary>
    public class Startup02
    {
        public Startup02(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddControllers()
                //配置System.Text.Json选项
                .AddJsonOptions(jsonOption =>
                {
                    //整齐打印:压缩格式(一行)还是整齐格式(换行)
                    jsonOption.JsonSerializerOptions.WriteIndented = true;
                    //允许(忽略)对象或数据末尾多余的逗号
                    jsonOption.JsonSerializerOptions.AllowTrailingCommas = true;
                    //自定义时间格式转换器
                    jsonOption.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
                    //转义字符串编码器:直接显示中文
                    jsonOption.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All);
                });

            //注册Swagger生成器,定义一个或多个 Swagger 文档
            services.AddSwaggerGen(setup =>
            {
                #region 定义Swagger文档
                //name参数即为SwaggerUI中SwaggerEndpoint方法参数中的{documentName}
                //两者必须保持一致,否则异常
                setup.SwaggerDoc(name: "v1", new OpenApiInfo { Title = "Swagger学习", Version = "第一版" });
                #endregion

                #region 包含xml注释
                var xmlCommentFiles = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, $"SwaggerStudy*.xml", System.IO.SearchOption.TopDirectoryOnly);
                foreach (var xmlFile in xmlCommentFiles)
                {
                    //includeControllerXmlComments参数:是否启用控制器上的xml注释
                    setup.IncludeXmlComments(filePath: xmlFile, includeControllerXmlComments: true);
                }
                #endregion
            });

            services.AddTransient<StudentServer>();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //启用 Swagger 中间件
            app.UseSwagger(setup=>
            { 
 
            });

            //启用 SwaggerUI 中间件
            app.UseSwaggerUI(setup => 
            {
                #region 添加Swagger JSON端点
                //必须包含{documentName}即是SwaggerDoc的name参数. 
                //默认为/swagger/{documentName}/swagger.json
                setup.SwaggerEndpoint("/swagger/v1/swagger.json", "Swagger学习第一版");
                #endregion
            });

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}