package automation

import (
	"context"
	"testing"

	"github.com/nexuscrm/kernel/pkg/recordoverlay"
	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
)

func TestAutomationFormulaFetchDeps_FetchByIDUsesRecordOverlay(t *testing.T) {
	query := &countingQuery{result: &models.QueryResult{Records: []models.SObject{{
		constants.FieldID: "parent-1",
		"Stage__c":        "Open",
	}}}}
	deps := &automationFormulaFetchDeps{
		e:    &FlowExecutor{query: query},
		user: &models.UserSession{ID: "005-user"},
	}
	ctx := recordoverlay.WithRecords(context.Background(), map[string]models.SObject{
		"RelatedObject/parent-1": {
			constants.FieldID: "parent-1",
			"Stage__c":        "Closed",
		},
	})

	record, err := deps.FetchByID(ctx, "RelatedObject", "parent-1")
	if err != nil {
		t.Fatalf("FetchByID() error = %v", err)
	}
	if query.calls != 1 {
		t.Fatalf("QueryWithFilter() calls = %d, want 1 to preserve projection contract", query.calls)
	}
	if got := record["Stage__c"]; got != "Closed" {
		t.Fatalf("FetchByID() Stage__c = %#v, want Closed", got)
	}
}

func TestAutomationFormulaFetchDeps_FetchByIDOverlayDoesNotBypassProjection(t *testing.T) {
	query := &countingQuery{result: &models.QueryResult{Records: []models.SObject{{
		constants.FieldID: "parent-1",
		"Stage__c":        "Open",
	}}}}
	deps := &automationFormulaFetchDeps{
		e:    &FlowExecutor{query: query},
		user: &models.UserSession{ID: "005-user"},
	}
	ctx := recordoverlay.WithRecords(context.Background(), map[string]models.SObject{
		"RelatedObject/parent-1": {
			constants.FieldID: "parent-1",
			"Stage__c":        "Closed",
			"Hidden__c":       "secret",
		},
	})

	record, err := deps.FetchByID(ctx, "RelatedObject", "parent-1")
	if err != nil {
		t.Fatalf("FetchByID() error = %v", err)
	}
	if query.calls != 1 {
		t.Fatalf("QueryWithFilter() calls = %d, want 1 to preserve projection contract", query.calls)
	}
	if got := record["Stage__c"]; got != "Closed" {
		t.Fatalf("FetchByID() Stage__c = %#v, want Closed", got)
	}
	if got, ok := record["Hidden__c"]; ok || got != nil {
		t.Fatalf("FetchByID() Hidden__c = %#v, want hidden overlay field omitted", got)
	}
}
