package errors

import "fmt"

// Code is a stable machine-readable error code.
type Code string

const (
	CodeInvalidEvent       Code = "invalid_event"
	CodeMissingField       Code = "missing_field"
	CodeInvalidField       Code = "invalid_field"
	CodeUnsupportedVersion Code = "unsupported_version"
)

// ContractError represents a validation error in event contracts.
type ContractError struct {
	Code    Code
	Field   string
	Message string
}

func (e *ContractError) Error() string {
	if e.Field != "" {
		return fmt.Sprintf("%s: %s (%s)", e.Code, e.Message, e.Field)
	}
	return fmt.Sprintf("%s: %s", e.Code, e.Message)
}

// New creates a ContractError with the given code, field, and message.
func New(code Code, field, message string) *ContractError {
	return &ContractError{Code: code, Field: field, Message: message}
}
