package main

import (
	"C"
	"encoding/hex"
	"github.com/lbryio/lbryschema.go/address"
	"github.com/lbryio/lbryschema.go/claim"
)

//export VerifySignature
func VerifySignature(claimHex string, certificateHex string, claimAddress string, certificateId string, blockchainName string) bool {
	decodedClaim, err := claim.DecodeClaimHex(claimHex, blockchainName)
	if err != nil {
		return false
	}
	decodedCertificate, err := claim.DecodeClaimHex(certificateHex, blockchainName)
	if err != nil {
		return false
	}
	result, err := decodedClaim.ValidateClaimSignature(decodedCertificate, claimAddress, certificateId, blockchainName)
	if err != nil {
		return false
	}
	return result
}

//export DecodeClaimHex
func DecodeClaimHex(claimHex string, blockchainName string) *C.char {
	decodedClaim, err := claim.DecodeClaimHex(claimHex, blockchainName)
	if err != nil {
		return C.CString("decode error: " + err.Error())
	}
	decoded, err := decodedClaim.RenderJSON()
	if err != nil {
		return C.CString("encode error: " + err.Error())
	}
	return C.CString(decoded)
}

//export SerializeClaimFromJSON
func SerializeClaimFromJSON(claimJSON string, blockchainName string) *C.char {
	decodedClaim, err := claim.DecodeClaimJSON(claimJSON, blockchainName)
	if err != nil {
		return C.CString("decode error: " + err.Error())
	}
	SerializedHex, err := decodedClaim.SerializedHexString()
	if err != nil {
		return C.CString("encode error: " + err.Error())
	}
	return C.CString(SerializedHex)
}

//export DecodeAddress
func DecodeAddress(addressString string, blockchainName string) *C.char {
	addressBytes, err := address.DecodeAddress(addressString, blockchainName)
	if err != nil {
		return C.CString("error: " + err.Error())
	}
	return C.CString(hex.EncodeToString(addressBytes[:]))
}

//export EncodeAddress
func EncodeAddress(addressChars string, blockchainName string) *C.char {
	addressBytes := [25]byte{}
	if len(addressChars) != 25 {
		return C.CString("error: address is not 25 bytes")
	}
	for i := range addressBytes {
		addressBytes[i] = byte(addressChars[i])
	}
	encodedAddress, err := address.EncodeAddress(addressBytes, blockchainName)
	if err != nil {
		return C.CString("error: " + err.Error())
	}
	return C.CString(encodedAddress)
}

func main() {}