using DigitalData.Core.Abstractions.Security.Key;
using DigitalData.Core.Abstractions.Security.Services;
using DigitalData.Core.Security.Config;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace DigitalData.Core.Security.Services;

public class RSAPool : RSAFactory, IAsymmetricKeyPool, IAsymmetricKeyFactory
{
    private readonly RSAParams _params;

    public IEnumerable<IAsymmetricDecryptor> Decryptors { get; }

    /// <summary>
    /// It is a separate decryptor for permanently stored encrypted data. It is assigned to the first Default decryptor by default.
    /// </summary>
    public IAsymmetricDecryptor VaultDecryptor { get; }

    public IEnumerable<IAsymmetricTokenDescriptor> TokenDescriptors { get; init; } = new List<IAsymmetricTokenDescriptor>();

    public RSAPool(IOptions<RSAParams> cryptoFactoryParamsOptions, ILogger<RSAPool>? logger = null)
    {
        _params = cryptoFactoryParamsOptions.Value;

        logger?.LogInformation("Core.Secrets version: {Version}, Created on: {CreationDate}.", Secrets.Version, Secrets.CreationDate.ToString("dd.MM.yyyy"));

        if (!_params.Decryptors.Any())
            throw new InvalidOperationException(
                "Any decryptor is not found. Ensure that at least one decryptor is configured in the provided parameters. " +
                "This issue typically arises if the configuration for decryptors is incomplete or missing. " +
                "Check the 'Decryptors' collection in the configuration and verify that it contains valid entries."
            );

        Decryptors = _params.Decryptors;

        TokenDescriptors = _params.TokenDescriptors;

        VaultDecryptor = _params.VaultDecryptor ?? Decryptors.First();
    }
}