using Azure.Core;
using HeaderRecord;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Net.Http;

namespace EVCB_OCPP.Service
{
    public static partial class AppExtention
    {
        public static void AddHeaderRecordService(this IServiceCollection services)
        {
            services.AddTransient<HeaderRecordService>();
        }

        public static void UseHeaderRecordService(this WebApplication webApplication)
        {
            webApplication.Use(async (context, next) =>
            {
                var servcie = context.RequestServices.GetService<HeaderRecordService>();
                servcie.LogRequest(context.TraceIdentifier, context.Request);
                await next(context);
                servcie.LogResponse(context.TraceIdentifier, context.Response);
                return;
            });
        }
    }
}

namespace HeaderRecord
{

    public class HeaderRecordService
    {
        private readonly ILogger<HeaderRecordService> logger;

        public HeaderRecordService(ILogger<HeaderRecordService> logger)
        {
            this.logger = logger;
        }

        internal void LogRequest(string traceIdentifier, HttpRequest request)
        {
            logger.LogInformation("LogRequest============================================================");
            logger.LogInformation("{id} {method} {path} {protocol}", traceIdentifier, request.Method, request.Path, request.Protocol);
            foreach (var headerKey in request.Headers.Keys)
            {
                logger.LogInformation("{id} {key} {value}", traceIdentifier, headerKey, request.Headers[headerKey]);
            }
            logger.LogInformation("LogRequest============================================================");
        }

        internal void LogResponse(string traceIdentifier, HttpResponse response)
        {
            logger.LogInformation("LogResponse============================================================");
            foreach (var headerKey in response.Headers.Keys)
            {
                logger.LogInformation("{id} {key} {value}", traceIdentifier, headerKey, response.Headers[headerKey]);
            }
            logger.LogInformation("LogResponse============================================================");
        }
    }
}