using Microsoft.Extensions.Logging;
using PARR.BLL.Contracts.Interfaces;
using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces;
using System.Net;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

namespace PARR.BLL.Services.Implementations
{
    internal class MqAdminService : IMqAdminService
    {
        private readonly HttpClient httpClient;
        private readonly ILogger<MqAdminService> logger;

        public MqAdminService(HttpClient httpClient, ILogger<MqAdminService> logger)
        {
            this.httpClient = httpClient;
            this.logger = logger;
        }


        public async Task<MqApiResult> GetConnectionsAsync(IMqSettings mqSettings)
        {
            var url = $"http://{mqSettings.HostName}:15672/api/connections";

            return await SendRequestAsync(mqSettings, url);
        }


        public async Task<MqApiResult> GetQueuesAsync(IMqSettings mqSettings)
        {
            var url = $"http://{mqSettings.HostName}:15672/api/queues";

            return await SendRequestAsync(mqSettings, url);
        }


        private async Task<MqApiResult> SendRequestAsync(IMqSettings mqSettings, string url)
        {
            SetAuthorizationHeaders(mqSettings);

            try
            {
                var result = await httpClient.GetAsync(url);

                if (result.StatusCode == HttpStatusCode.OK)
                {
                    var content = await result.Content.ReadAsStringAsync();
                    var json = JsonSerializer.Deserialize<object>(content);

                    return new MqApiResult { IsSuccess = true, Response = json };
                }
                else
                {
                    logger.LogError($"Ошибка при запросе к RabbitMq, url: {url}, StatusCode: {result.StatusCode}");

                    return new MqApiResult { IsSuccess = false };
                }
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"Ошибка при запросе к RabbitMQ, url: {url}");
                return new MqApiResult { IsSuccess = false, Exception = ex };
            }
        }


        private void SetAuthorizationHeaders(IMqSettings mqSettings)
        {
            httpClient.DefaultRequestHeaders.Clear();
            httpClient.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{mqSettings.User}:{mqSettings.Password}")));

        }
    }
}
