package models

import (
	"strings"
	"testing"
)

func TestValidateFlowAtomicHistoryPrelocksRequiresMatchingBusinessRowPrelock(t *testing.T) {
	meta := FlowMetadata{
		RunAtomically: true,
		AtomicParentPrelocks: []FlowAtomicParentPrelock{{
			Name:         "CampaignRows",
			ParentObject: "Campaign",
		}},
		AtomicHistoryPrelocks: []FlowAtomicHistoryPrelock{{
			Object: "Account",
			Fields: []string{"Name"},
		}},
	}

	err := ValidateFlowAtomicHistoryPrelocks(meta)
	if err == nil || !strings.Contains(err.Error(), "business-row prelock") {
		t.Fatalf("ValidateFlowAtomicHistoryPrelocks() error = %v, want business-row prelock requirement", err)
	}
}

func TestValidateFlowAtomicHistoryPrelocksRejectsInvalidDeclarations(t *testing.T) {
	tests := []struct {
		name string
		meta FlowMetadata
		want string
	}{
		{
			name: "non atomic flow",
			meta: FlowMetadata{AtomicHistoryPrelocks: []FlowAtomicHistoryPrelock{{Object: "Account", Fields: []string{"Name"}}}},
			want: "runAtomically=true",
		},
		{
			name: "missing object",
			meta: FlowMetadata{RunAtomically: true, AtomicHistoryPrelocks: []FlowAtomicHistoryPrelock{{Fields: []string{"Name"}}}},
			want: "valid object",
		},
		{
			name: "missing fields",
			meta: FlowMetadata{RunAtomically: true, AtomicHistoryPrelocks: []FlowAtomicHistoryPrelock{{Object: "Account"}}},
			want: "at least one field",
		},
		{
			name: "invalid field",
			meta: FlowMetadata{RunAtomically: true, AtomicHistoryPrelocks: []FlowAtomicHistoryPrelock{{Object: "Account", Fields: []string{"bad field"}}}},
			want: "valid field",
		},
		{
			name: "duplicate field",
			meta: FlowMetadata{RunAtomically: true, AtomicHistoryPrelocks: []FlowAtomicHistoryPrelock{
				{Object: "Account", Fields: []string{"Name"}},
				{Object: "account", Fields: []string{"name"}},
			}},
			want: "duplicate field",
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			err := ValidateFlowAtomicHistoryPrelocks(test.meta)
			if err == nil || !strings.Contains(err.Error(), test.want) {
				t.Fatalf("ValidateFlowAtomicHistoryPrelocks() error = %v, want %q", err, test.want)
			}
		})
	}
}
