using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

namespace LevelCode.License.Security
{
    public static class LicenseEngine
    {
        // =========================
        // GERAR ARQUIVO .KEY
        // =========================
        public static void GerarArquivoKey(
            LicensePayload payload,
            string chavePrivada,
            string caminhoArquivo)
        {
            if (payload == null)
                throw new ArgumentNullException(nameof(payload));

            if (string.IsNullOrWhiteSpace(chavePrivada))
                throw new ArgumentException("Chave privada inválida.");

            // 1️⃣ Serializa payload (somente dados)
            string json = JsonSerializer.Serialize(payload);
            byte[] dados = Encoding.UTF8.GetBytes(json);

            // 2️⃣ Assina os dados
            byte[] assinatura;
            using (RSA rsa = RSA.Create())
            {
                rsa.FromXmlString(chavePrivada);
                assinatura = rsa.SignData(
                    dados,
                    HashAlgorithmName.SHA256,
                    RSASignaturePadding.Pkcs1);
            }

            // 3️⃣ Monta o arquivo .key
            string conteudoFinal =
                Convert.ToBase64String(dados) +
                "|SIGN|" +
                Convert.ToBase64String(assinatura);

            // 4️⃣ Salva o arquivo
            File.WriteAllText(caminhoArquivo, conteudoFinal, Encoding.UTF8);
        }
    }
}
