package wire

import (
	"go/ast"
	"go/parser"
	"go/token"
	"strconv"
	"strings"
	"testing"
)

// The legacy package may map legacy neutral errors, but product wire literals
// have one owner: sfcrm/wire. This guard prevents a future compatibility edit
// from silently recreating a second Salesforce grammar here.
func TestLegacyAdapterDoesNotReownProductWireLiterals(t *testing.T) {
	parsed, err := parser.ParseFile(token.NewFileSet(), "wire.go", nil, 0)
	if err != nil {
		t.Fatal(err)
	}
	ast.Inspect(parsed, func(node ast.Node) bool {
		literal, ok := node.(*ast.BasicLit)
		if !ok || literal.Kind != token.STRING {
			return true
		}
		value, unquoteErr := strconv.Unquote(literal.Value)
		if unquoteErr != nil {
			t.Errorf("unquote %s: %v", literal.Value, unquoteErr)
			return true
		}
		if strings.Contains(value, "/services/data/") || strings.Contains(value, "Direct create of ") ||
			strings.Contains(value, "Contact your system administrator") || isSalesforceErrorCode(value) {
			t.Errorf("legacy adapter reintroduced product wire literal %q", value)
		}
		return true
	})
}

func isSalesforceErrorCode(value string) bool {
	switch value {
	case "UNAUTHORIZED", "CONFLICT", "FORBIDDEN":
		return true
	}
	if value == "" {
		return false
	}
	for _, character := range value {
		if character != '_' && (character < 'A' || character > 'Z') {
			return false
		}
	}
	return strings.Contains(value, "_")
}
