using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Http;
using Serilog;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace IRaCIS.Core.API
{
    public class SerilogHelper
    {
        //public static string RequestPayload = "";

        public static  void EnrichFromRequest(IDiagnosticContext diagnosticContext, HttpContext httpContext)
        {
            var request = httpContext.Request;

            // Set all the common properties available for every request
            diagnosticContext.Set("Host", request.Host);

            //这种获取的Ip不准 配置服务才行
            diagnosticContext.Set("RequestIP", httpContext.Connection.RemoteIpAddress.ToString());

            //这种方式可以，但是serilog提供了 就不用了
            //diagnosticContext.Set("TestIP", httpContext.GetUserIp());

            diagnosticContext.Set("Protocol", request.Protocol);
            diagnosticContext.Set("Scheme", request.Scheme);

            //这种方式不行 读取的body为空字符串  必须在中间件中读取
            //diagnosticContext.Set("RequestBody", await ReadRequestBody(httpContext.Request));
            //diagnosticContext.Set("RequestBody", RequestPayload);

            // Only set it if available. You're not sending sensitive data in a querystring right?!
            if (request.QueryString.HasValue)
            {
                diagnosticContext.Set("QueryString", request.QueryString.Value);
            }

            // Set the content-type of the Response at this point
            diagnosticContext.Set("ContentType", httpContext.Response.ContentType);

            diagnosticContext.Set("TokenUserRealName", httpContext?.User?.FindFirst("realName")?.Value);

            diagnosticContext.Set("TokenUserType", httpContext?.User?.FindFirst("userTypeEnumName")?.Value);

            // Retrieve the IEndpointFeature selected for the request
            var endpoint = httpContext.GetEndpoint();
            if (endpoint is object) // endpoint != null
            {
                diagnosticContext.Set("EndpointName", endpoint.DisplayName);
            }
        }


    }
}
