package tools

import (
	"crypto/ed25519"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"os"

	"cloud.o-forge.io/core/oc-lib/config"
	"github.com/libp2p/go-libp2p/core/crypto"
)

func LoadKeyFromFilePrivate() (crypto.PrivKey, error) {
	path := config.GetConfig().PrivateKeyPath
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}
	block, _ := pem.Decode(data)
	keyAny, err := x509.ParsePKCS8PrivateKey(block.Bytes)
	if err != nil {
		return nil, err
	}

	edKey, ok := keyAny.(ed25519.PrivateKey)
	if !ok {
		return nil, fmt.Errorf("not an ed25519 key")
	}
	return crypto.UnmarshalEd25519PrivateKey(edKey)
}

func LoadKeyFromFilePublic() (crypto.PubKey, error) {
	path := config.GetConfig().PublicKeyPath
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}
	block, _ := pem.Decode(data)
	keyAny, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return nil, err
	}

	edKey, ok := keyAny.(ed25519.PublicKey)
	if !ok {
		return nil, fmt.Errorf("not an ed25519 key")
	}
	// Try to unmarshal as libp2p private key (supports ed25519, rsa, etc.)
	return crypto.UnmarshalEd25519PublicKey(edKey)
}
