using System.Text;
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)
    {
        Guid organizationId = eventMessage.OrganizationId ?? Guid.NewGuid();

        var configurations = await configurationRepository.GetConfigurationsAsync<WebhookConfiguration>(organizationId,
            IntegrationType.Webhook, eventMessage.Type);

        foreach (var configuration in configurations)
        {
            var content = new StringContent(
                TemplateProcessor.ReplaceTokens(configuration.Template, eventMessage),
                Encoding.UTF8,
                "application/json"
            );
            var response = await _httpClient.PostAsync(
                configuration.Configuration.Url,
                content);
            response.EnsureSuccessStatusCode();
        }
    }

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