using System;
using System.Security.Cryptography;
using System.Text;

namespace LevelCode.License.Security
{
    public static class RsaService
    {
        // =========================
        // GERAR PAR DE CHAVES
        // =========================
        public static void GerarParDeChaves(
            out string chavePublica,
            out string chavePrivada,
            int tamanho = 2048)
        {
            using (var rsa = new RSACryptoServiceProvider(tamanho))
            {
                chavePublica = rsa.ToXmlString(false); // public key
                chavePrivada = rsa.ToXmlString(true);  // private key
            }
        }

        // =========================
        // ASSINAR TEXTO (PRIVATE KEY)
        // =========================
        public static string Assinar(string texto, string chavePrivada)
        {
            if (string.IsNullOrWhiteSpace(texto))
                throw new ArgumentException("Texto inválido para assinatura.");

            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.FromXmlString(chavePrivada);

                byte[] dados = Encoding.UTF8.GetBytes(texto);
                byte[] assinatura = rsa.SignData(dados, CryptoConfig.MapNameToOID("SHA256"));

                return Convert.ToBase64String(assinatura);
            }
        }

        // =========================
        // VALIDAR ASSINATURA (PUBLIC KEY)
        // =========================
        public static bool ValidarAssinatura(
            string texto,
            string assinaturaBase64,
            string chavePublica)
        {
            if (string.IsNullOrWhiteSpace(texto) ||
                string.IsNullOrWhiteSpace(assinaturaBase64))
                return false;

            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.FromXmlString(chavePublica);

                byte[] dados = Encoding.UTF8.GetBytes(texto);
                byte[] assinatura = Convert.FromBase64String(assinaturaBase64);

                return rsa.VerifyData(
                    dados,
                    CryptoConfig.MapNameToOID("SHA256"),
                    assinatura);
            }
        }
    }
}
