package bootstrap

import (
	"fmt"
	"testing"
)

var guardMappingColumns = []string{
	"SourceObject",
	"TargetObject",
	"ActionType",
	"SourceField",
	"TargetField",
	"SourceLookupField",
}

var guardActionFlowColumns = []string{
	"OwningStandardActionId",
	"ActionName",
	"FlowMetadata",
}

func guardFlowMetadata(sourceObject, targetObject, actionType, sourceLookupField string) string {
	return guardFlowMetadataWithAssignmentReference(sourceObject, targetObject, actionType, sourceLookupField, "sourceRecord.Id")
}

func guardFlowMetadataWithAssignmentReference(sourceObject, targetObject, actionType, sourceLookupField, assignmentReference string) string {
	return fmt.Sprintf(`{"recordCreates":[{"name":"create_target","object":%q,"fieldMapping":{"sourceObject":%q,"sourceReference":"sourceRecord","targetObject":%q,"actionType":%q},"inputAssignments":[{"field":%q,"value":{"elementReference":%q}}]}]}`,
		targetObject, sourceObject, targetObject, actionType, sourceLookupField, assignmentReference)
}

func guardFlowMetadataWithLookupBoundAssignment(sourceObject, targetObject, actionType, sourceLookupField, sourceIDReference string) string {
	return fmt.Sprintf(`{"recordLookups":[{"name":"get_source","object":%q,"filters":[{"field":"Id","operator":"EqualTo","value":{"elementReference":%q}}],"outputReference":"$source","getFirstRecordOnly":true}],"recordCreates":[{"name":"create_target","object":%q,"fieldMapping":{"sourceObject":%q,"sourceReference":"$source","targetObject":%q,"actionType":%q},"inputAssignments":[{"field":%q,"value":{"elementReference":%q}}]}]}`,
		sourceObject, sourceIDReference, targetObject, sourceObject, targetObject, actionType, sourceLookupField, sourceIDReference)
}

func guardFlowMetadataWithoutInputAssignments(sourceObject, targetObject, actionType string) string {
	return fmt.Sprintf(`{"recordCreates":[{"name":"create_target","object":%q,"fieldMapping":{"sourceObject":%q,"sourceReference":"sourceRecord","targetObject":%q,"actionType":%q}}]}`,
		targetObject, sourceObject, targetObject, actionType)
}

// Nil DB → nil result, no error. Matches the records-layer applier's
// nil-rawDB no-op contract.
func TestGetCreateFromSourceGuardEntries_NilDBIsNoOp(t *testing.T) {
	entries, err := GetCreateFromSourceGuardEntries(nil, "T")
	if err != nil {
		t.Fatalf("got err = %v; want nil", err)
	}
	if entries != nil {
		t.Fatalf("got entries = %v; want nil", entries)
	}
}

func createFromSourceCoverageGroups(sourceField, targetField, sourceLookupField string) []FieldMappingGroup {
	return []FieldMappingGroup{{
		SourceObject: "Src",
		TargetObject: "T",
		ActionType:   "createT",
		Mappings: []FieldMappingDef{{
			SourceField:       sourceField,
			TargetField:       targetField,
			SourceLookupField: sourceLookupField,
		}},
	}}
}
