using System.Text;
using System.Text.Json;
using Bit.Core.AdminConsole.Utilities;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.Models.Data.Integrations;
using Bit.Core.Repositories;

#nullable enable

namespace Bit.Core.Services;

public class WebhookEventHandler(
    IHttpClientFactory httpClientFactory,
    IOrganizationIntegrationConfigurationRepository configurationRepository)
    : IEventMessageHandler
{
    private readonly HttpClient _httpClient = httpClientFactory.CreateClient(HttpClientName);

    public const string HttpClientName = "WebhookEventHandlerHttpClient";

    public async Task HandleEventAsync(EventMessage eventMessage)
    {
        var organizationId = eventMessage.OrganizationId ?? Guid.Empty;
        var configurations = await configurationRepository.GetConfigurationDetailsAsync(
            organizationId,
            IntegrationType.Webhook,
            eventMessage.Type);

        foreach (var configuration in configurations)
        {
            var config = configuration.MergedConfiguration.Deserialize<WebhookIntegrationConfigurationDetils>();
            if (config is null || string.IsNullOrEmpty(config.url))
            {
                continue;
            }

            var content = new StringContent(
                IntegrationTemplateProcessor.ReplaceTokens(configuration.Template, eventMessage),
                Encoding.UTF8,
                "application/json"
            );
            var response = await _httpClient.PostAsync(
                config.url,
                content);
            response.EnsureSuccessStatusCode();
        }
    }

    public async Task HandleManyEventsAsync(IEnumerable<EventMessage> eventMessages)
    {
        foreach (var eventMessage in eventMessages)
        {
            await HandleEventAsync(eventMessage);
        }
    }
}