package certs

import (
	"crypto/ecdsa"
	"crypto/x509"
	"encoding/pem"
	"errors"

	xerrors "github.com/pkg/errors"
)

// 将 x509.Certificate 对象转换为 PEM 编码的字符串。
//
// 入参:
//   - cert: x509.Certificate 对象。
//
// 出参:
//   - certPem: 证书 PEM 内容。
//   - err: 错误。
func ConvertCertificateToPEM(cert *x509.Certificate) (certPem string, err error) {
	if cert == nil {
		return "", errors.New("`cert` is nil")
	}

	block := &pem.Block{
		Type:  "CERTIFICATE",
		Bytes: cert.Raw,
	}

	return string(pem.EncodeToMemory(block)), nil
}

// 将 ecdsa.PrivateKey 对象转换为 PEM 编码的字符串。
//
// 入参:
//   - privkey: ecdsa.PrivateKey 对象。
//
// 出参:
//   - privkeyPem: 私钥 PEM 内容。
//   - err: 错误。
func ConvertECPrivateKeyToPEM(privkey *ecdsa.PrivateKey) (privkeyPem string, err error) {
	if privkey == nil {
		return "", errors.New("`privkey` is nil")
	}

	data, err := x509.MarshalECPrivateKey(privkey)
	if err != nil {
		return "", xerrors.Wrap(err, "failed to marshal EC private key")
	}

	block := &pem.Block{
		Type:  "EC PRIVATE KEY",
		Bytes: data,
	}

	return string(pem.EncodeToMemory(block)), nil
}