package metadata

import (
	"testing"

	"github.com/nexuscrm/shared/pkg/models"
)

// TestPrepareValidationRelatedRecordStampsObjectTypeWhenAbsent locks the Cut #2
// refactor that folded raw object-type stamping into models.StampObjectType. The
// reachable input is a raw DB row from recordRepo.FindOne; the function must
// stamp neutral object-type metadata in place so downstream __r resolution sees
// the object type.
func TestPrepareValidationRelatedRecordStampsObjectTypeWhenAbsent(t *testing.T) {
	schema := &models.ObjectMetadata{APIName: "Account"}
	record := models.SObject{"Id": "001000000000001"}

	prepareValidationRelatedRecordForFormulaEval(record, schema)

	if got := models.RecordObjectType(record); got != "Account" {
		t.Fatalf("object type = %q, want Account; record=%#v", got, record)
	}
	if _, ok := record["attributes"]; ok {
		t.Fatalf("v63 attributes emitted in metadata layer: %#v", record["attributes"])
	}
}

// TestPrepareValidationRelatedRecordKeepsCallerObjectType asserts the
// caller-value-wins contract of StampObjectType: when the record already carries
// an attributes envelope with a `type` key from v63 ingress, the function must
// not overwrite it.
func TestPrepareValidationRelatedRecordKeepsCallerObjectType(t *testing.T) {
	schema := &models.ObjectMetadata{APIName: "Account"}
	record := models.SObject{
		"Id":         "001000000000001",
		"attributes": map[string]interface{}{"type": "X"},
	}

	prepareValidationRelatedRecordForFormulaEval(record, schema)

	if got := models.RecordObjectType(record); got != "X" {
		t.Fatalf("object type = %#v, want caller value \"X\"", got)
	}
}

// TestPrepareValidationRelatedRecordNilGuards asserts the nil record / nil schema
// fast paths do not panic.
func TestPrepareValidationRelatedRecordNilGuards(t *testing.T) {
	prepareValidationRelatedRecordForFormulaEval(nil, &models.ObjectMetadata{APIName: "Account"})
	prepareValidationRelatedRecordForFormulaEval(models.SObject{"Id": "001"}, nil)
	prepareValidationRelatedRecordForFormulaEval(nil, nil)
}
