package packs

import (
	"os"
	"path/filepath"
	"slices"
	"testing"
)

// #555 current-tree contract guard:
// lock the public-core Quote static required field set before any L1 mutation.
func TestCRMStandardPackQuoteStaticRequiredContract(t *testing.T) {
	raw, err := os.ReadFile(filepath.Join(officialPackRootFromThisFile(t), "salesforce-crm-standard", "objects", "standard_objects_spec.json"))
	if err != nil {
		t.Fatalf("read CRM pack object spec: %v", err)
	}
	specs, err := parseObjectSpecsJSON(raw, "official_repo:salesforce-crm-standard/objects/standard_objects_spec.json")
	if err != nil {
		t.Fatalf("parse CRM pack object spec: %v", err)
	}

	var quote *ObjectSpec
	for i := range specs {
		if specs[i].APIName == "Quote" {
			quote = &specs[i]
			break
		}
	}
	if quote == nil {
		t.Fatal("Quote object spec missing from public-core CRM pack")
	}

	fields := make(map[string]FieldSpec, len(quote.Fields))
	var requiredFields []string
	for _, field := range quote.Fields {
		fields[field.APIName] = field
		if field.Required {
			requiredFields = append(requiredFields, field.APIName)
		}
	}

	slices.Sort(requiredFields)
	if !slices.Equal(requiredFields, []string{"Name", "Status"}) {
		t.Fatalf("Quote required field set = %v, want [Name Status]", requiredFields)
	}

	status, ok := fields["Status"]
	if !ok {
		t.Fatal("Quote.Status missing from public-core CRM pack")
	}
	if !status.Required {
		t.Fatal("Quote.Status must remain static required in the public-core CRM pack")
	}

	// Public-core Quote should not silently absorb custom business fields.
	for fieldName := range fields {
		if len(fieldName) > 3 && fieldName[len(fieldName)-3:] == "__c" {
			t.Fatalf("Quote.%s must not be authored in the current public-core CRM pack", fieldName)
		}
	}
}
