package vo

import (
	"fmt"
	"regexp"
	"strings"
)

// TransactionHash is a value object representing an on-chain transaction hash.
type TransactionHash struct {
	value string
}

// txHashPattern matches a hex-encoded transaction hash (0x-prefixed, 64 hex chars for 32 bytes).
var txHashPattern = regexp.MustCompile(`^0x[0-9a-fA-F]{64}$`)

// NewTransactionHash creates a validated TransactionHash value object.
func NewTransactionHash(raw string) (TransactionHash, error) {
	trimmed := strings.TrimSpace(raw)
	if trimmed == "" {
		return TransactionHash{}, fmt.Errorf("transaction hash must not be empty")
	}
	if !txHashPattern.MatchString(trimmed) {
		return TransactionHash{}, fmt.Errorf("invalid transaction hash format: %s", trimmed)
	}
	// Normalise to lowercase
	return TransactionHash{value: strings.ToLower(trimmed)}, nil
}

// Value returns the string value of the transaction hash.
func (h TransactionHash) Value() string {
	return h.value
}

// String returns the string representation.
func (h TransactionHash) String() string {
	return h.value
}

// IsValid reports whether the hash passes format validation.
func (h TransactionHash) IsValid() bool {
	return txHashPattern.MatchString(h.value)
}
