using DigitalData.Core.Abstractions.Security.Key;
using DigitalData.Core.Security.RSAKey.Base;
using System.Reflection;
using System.Security.Cryptography;

namespace DigitalData.Core.Security.RSAKey.Crypto;

public class RSADecryptor : RSAPrivateKey, IAsymmetricDecryptor
{
    public RSAEncryptionPadding Padding { get; init; } = RSAEncryptionPadding.OaepSHA256;

    // TODO: add as json converter to IConfigurIConfiguration.Config
    public string PaddingName
    {
        get => Padding.ToString();
        init => Padding = typeof(RSAEncryptionPadding).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) as RSAEncryptionPadding ?? throw new ArgumentException($"Padding '{value}' not found.");
    }

    public byte[] Decrypt(byte[] data) => RSA.Decrypt(data, Padding);

    private readonly Lazy<IAsymmetricEncryptor> _lazyEncryptor;

    public IAsymmetricEncryptor Encryptor => _lazyEncryptor.Value;

    public RSADecryptor()
    {
        _lazyEncryptor = new(() => new RSAEncryptor()
        {
            Content = RSA.ExportRSAPublicKeyPem(),
            Padding = Padding
        });
    }
}