package mailruntime

import "errors"

// ErrorCode is the closed Extension-platform-compatible Mail failure set.
type ErrorCode string

const (
	ErrorValidation       ErrorCode = "validation"
	ErrorPermissionDenied ErrorCode = "permission_denied"
	ErrorNotFound         ErrorCode = "not_found"
	ErrorConflict         ErrorCode = "conflict"
	ErrorProviderAuth     ErrorCode = "provider_auth_unavailable"
	ErrorRateLimited      ErrorCode = "rate_limited"
	ErrorUpstream         ErrorCode = "upstream_failure"
	ErrorInternal         ErrorCode = "internal"
)

// Error renders only a stable safe message. Cause remains process-local.
type Error struct {
	Code    ErrorCode
	Message string
	cause   error
}

func (err *Error) Error() string {
	if err == nil {
		return ""
	}
	return err.Message
}

func (err *Error) Unwrap() error {
	if err == nil {
		return nil
	}
	return err.cause
}

func (err *Error) ExtensionInvocationErrorCode() string {
	if err == nil {
		return ""
	}
	return string(err.Code)
}

func ErrorCodeOf(err error) (ErrorCode, bool) {
	var mailErr *Error
	if !errors.As(err, &mailErr) || mailErr == nil {
		return "", false
	}
	return mailErr.Code, true
}

func mailError(code ErrorCode, message string, cause error) error {
	return &Error{Code: code, Message: message, cause: cause}
}
