using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace FastGithub
{
    /// 
    /// 表示中间件创建者
    /// 
    public class PipelineBuilder : IPipelineBuilder
    {
        private readonly InvokeDelegate completedHandler;
        private readonly List, InvokeDelegate>> middlewares = new();
        /// 
        /// 获取服务提供者
        /// 
        public IServiceProvider AppServices { get; }
        /// 
        /// 中间件创建者
        /// 
        /// 
        public PipelineBuilder(IServiceProvider appServices)
            : this(appServices, context => Task.CompletedTask)
        {
        }
        /// 
        /// 中间件创建者
        /// 
        /// 
        /// 完成执行内容处理者
        public PipelineBuilder(IServiceProvider appServices, InvokeDelegate completedHandler)
        {
            this.AppServices = appServices;
            this.completedHandler = completedHandler;
        }
        /// 
        /// 使用中间件
        /// 
        /// 
        /// 
        /// 
        /// 
        public IPipelineBuilder Use() where TMiddleware : class, IMiddleware
        {
            var middleware = this.AppServices.GetRequiredService();
            return this.Use(middleware.InvokeAsync);
        }
        /// 
        /// 使用中间件
        /// 
        /// 
        /// 
        /// 
        /// 
        public IPipelineBuilder Use(Func, Task> middleware)
        {
            return this.Use(next => context => middleware(context, () => next(context)));
        }
        /// 
        /// 使用中间件
        /// 
        /// 
        /// 
        public IPipelineBuilder Use(Func, InvokeDelegate> middleware)
        {
            this.middlewares.Add(middleware);
            return this;
        }
        /// 
        /// 创建所有中间件执行处理者
        /// 
        /// 
        public InvokeDelegate Build()
        {
            var handler = this.completedHandler;
            for (var i = this.middlewares.Count - 1; i >= 0; i--)
            {
                handler = this.middlewares[i](handler);
            }
            return handler;
        }
        /// 
        /// 使用默认配制创建新的PipelineBuilder
        /// 
        /// 
        public IPipelineBuilder New()
        {
            return new PipelineBuilder(this.AppServices, this.completedHandler);
        }
    }
}