using Lada.Framework.Swaggers;
using Microsoft.OpenApi.Models;
using System.Reflection;

namespace Ladaer.BackEnd.Infrastructures.Startup
{
    /// <summary>
    /// Lớp mở rộng để đăng ký các dịch vụ và middleware của Swagger.
    /// </summary>
    public static class SwaggerRegister
    {
        /// <summary>
        /// Đăng ký các dịch vụ của Swagger.
        /// </summary>
        /// <param name="services">Đối tượng IServiceCollection.</param>
        public static void RegisterSwaggerServices(this IServiceCollection services)
        {
            var jwtScheme = new OpenApiSecurityScheme
            {
                Type = SecuritySchemeType.Http,
                Scheme = "bearer",
                BearerFormat = "JWT",
                In = ParameterLocation.Header,
                Name = "Authorization",
                Description = "Chỉ dán token (không cần 'Bearer ').",
                Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
            };


            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "LADAER API", Version = "v1" });

                // Set the comments path for the Swagger JSON and UI.
                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                c.IncludeXmlComments(xmlPath);
                c.AddSecurityDefinition("Bearer", jwtScheme);
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    { jwtScheme, Array.Empty<string>() }
                });
            });
        }

        /// <summary>
        /// Đăng ký các middleware của Swagger.
        /// </summary>
        /// <param name="app">Đối tượng IApplicationBuilder.</param>
        public static void RegisterSwagger(this IApplicationBuilder app)
        {
            app.UseSwaggerAuthorized();
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Inventory API");
                c.RoutePrefix = string.Empty;
            });
        }
    }
}
