using Jellyfin.Server.Extensions;
using Jellyfin.Server.Middleware;
using Jellyfin.Server.Models;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Prometheus;
namespace Jellyfin.Server
{
    /// 
    /// Startup configuration for the Kestrel webhost.
    /// 
    public class Startup
    {
        private readonly IServerConfigurationManager _serverConfigurationManager;
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The server configuration manager.
        public Startup(IServerConfigurationManager serverConfigurationManager)
        {
            _serverConfigurationManager = serverConfigurationManager;
        }
        /// 
        /// Configures the service collection for the webhost.
        /// 
        /// The service collection.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddResponseCompression();
            services.AddHttpContextAccessor();
            services.AddJellyfinApi(_serverConfigurationManager.Configuration.BaseUrl.TrimStart('/'));
            services.AddJellyfinApiSwagger();
            // configure custom legacy authentication
            services.AddCustomAuthentication();
            services.AddJellyfinApiAuthorization();
        }
        /// 
        /// Configures the app builder for the webhost.
        /// 
        /// The application builder.
        /// The webhost environment.
        /// The server application host.
        public void Configure(
            IApplicationBuilder app,
            IWebHostEnvironment env,
            IServerApplicationHost serverApplicationHost)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMiddleware();
            app.UseWebSockets();
            app.UseResponseCompression();
            // TODO app.UseMiddleware();
            app.UseAuthentication();
            app.UseJellyfinApiSwagger(_serverConfigurationManager);
            app.UseRouting();
            app.UseCors(ServerCorsPolicy.DefaultPolicyName);
            app.UseAuthorization();
            if (_serverConfigurationManager.Configuration.EnableMetrics)
            {
                // Must be registered after any middleware that could chagne HTTP response codes or the data will be bad
                app.UseHttpMetrics();
            }
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                if (_serverConfigurationManager.Configuration.EnableMetrics)
                {
                    endpoints.MapMetrics(_serverConfigurationManager.Configuration.BaseUrl.TrimStart('/') + "/metrics");
                }
            });
            app.Use(serverApplicationHost.ExecuteHttpHandlerAsync);
        }
    }
}