using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace HttpClientStudy.Core
{
    /// <summary>
    /// 管道方式 HttpClient客户端
    /// </summary>
    public class PipelineHttpClient
    {
        public List<DelegatingHandler> HttpMessageHandlers { get; set; }

        public PipelineHttpClient()
        {
            HttpMessageHandlers = new List<DelegatingHandler>()
            {
                new CustomHeadersHandler(),
                new LoggingHandler(),
            };

        }

        public PipelineHttpClient(List<DelegatingHandler> httpMessageHandlers)
        {
            HttpMessageHandlers = httpMessageHandlers;
            if (httpMessageHandlers == null || httpMessageHandlers?.Count == 0)
            {
                HttpMessageHandlers = new List<DelegatingHandler>();
            }
        }

        public void AddDelegatingHandler(DelegatingHandler handler)
        {
            HttpMessageHandlers.Add(handler);
        }

        public HttpClient CreateHttpClient()
        {
            //创建处理器链

            //最终处理器:最后一个请求处理程序,默认是SocketsHttpHandler.
            HttpMessageHandler currentPipeLine = new SocketsHttpHandler()
            {
                //自定义配置
                PooledConnectionLifetime = TimeSpan.FromSeconds(120),
            };
            //pipeline = new CustomHeadersHandler() { InnerHandler = pipeline};
            //pipeline = new LoggingHandler () { InnerHandler = pipeline};

            //倒序组装:完成后执行顺序与注册顺序一致
            HttpMessageHandlers.Reverse();
            for (int i = 0; i < HttpMessageHandlers.Count; i++)
            {
                HttpMessageHandlers[i].InnerHandler = currentPipeLine;
                currentPipeLine = HttpMessageHandlers[i];
            }

            // 利用管道创建HttpClient
            var httpClient = new HttpClient(currentPipeLine);

            return httpClient;
        }
    }

    /// <summary>
    /// 默认处理器1 - 添加自定义请求头
    /// </summary>
    public class CustomHeadersHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // 在请求中添加自定义头部
            request.Headers.Add("X-Custom-Header", "CustomValue");

            // 调用管道中的下一个处理器
            return await base.SendAsync(request, cancellationToken);

            //响应信息(可不处理)
        }
    }

    /// <summary>
    /// 默认处理器1 - 简单的日志记录
    /// </summary>
    public class LoggingHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // 记录请求信息
            Console.WriteLine($"Request: {request.Method} {request.RequestUri}");

            // 调用管道中的下一个处理器,并获取响应
            var response = await base.SendAsync(request, cancellationToken);

            // 记录响应信息
            Console.WriteLine($"Response: {response.StatusCode}");

            return response;
        }
    }

}