using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using ScadaLink.AuditLog.Configuration;

namespace ScadaLink.AuditLog;

/// <summary>
/// Composition root for the Audit Log (#23) component. M1 registers
/// <see cref="AuditLogOptions"/> and its validator; later milestones extend
/// this method to wire up writers, telemetry actors, and the central ingest
/// pipeline. Audit Log (#23) sits alongside Notification Outbox (#21) and
/// Site Call Audit (#22).
/// </summary>
public static class ServiceCollectionExtensions
{
    /// <summary>Configuration section bound to <see cref="AuditLogOptions"/>.</summary>
    public const string ConfigSectionName = "AuditLog";

    /// <summary>
    /// Binds <see cref="AuditLogOptions"/> from the
    /// <see cref="ConfigSectionName"/> section of <paramref name="config"/>
    /// and registers <see cref="AuditLogOptionsValidator"/> so a misconfigured
    /// <c>AuditLog</c> section is rejected with a key-naming message when the
    /// options are first resolved (or at startup when consumers wire in
    /// <c>ValidateOnStart()</c>). M2+ will register writers, telemetry actors,
    /// and the central ingest pipeline here. <c>IAuditLogRepository</c> is
    /// registered by
    /// <c>ScadaLink.ConfigurationDatabase.ServiceCollectionExtensions.AddConfigurationDatabase</c>,
    /// so the caller (the Host on the central node) must also call that.
    /// </summary>
    public static IServiceCollection AddAuditLog(this IServiceCollection services, IConfiguration config)
    {
        ArgumentNullException.ThrowIfNull(services);
        ArgumentNullException.ThrowIfNull(config);

        services.AddOptions<AuditLogOptions>()
            .Bind(config.GetSection(ConfigSectionName))
            .ValidateOnStart();
        services.AddSingleton<IValidateOptions<AuditLogOptions>, AuditLogOptionsValidator>();

        return services;
    }
}
