package rest

import (
	"testing"

	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
	"github.com/stretchr/testify/assert"
)

func TestFillRelatedFormulaFields_UsesLookupRecordValues(t *testing.T) {
	record := models.SObject{
		"Campaign_Name__c": nil,
		"Lead_Status__c":   "",
	}

	fillRelatedFormulaFields(record, map[string]models.SObject{
		"Campaign": {constants.FieldName: "Spring Launch"},
		"Lead":     {"Status": "Open - Not Contacted"},
	})

	assert.Equal(t, "Spring Launch", record["Campaign_Name__c"])
	assert.Equal(t, "Open - Not Contacted", record["Lead_Status__c"])
}

func TestEnrichCampaignMemberRecords_FillsDerivedFieldsFromLookupsAndStatuses(t *testing.T) {
	record := models.SObject{
		"CampaignId":       "cmp-001",
		"LeadId":           "lead-001",
		"Status":           "Responded",
		"Campaign_Name__c": nil,
		"Lead_Status__c":   nil,
		"CompanyOrAccount": nil,
		"Name":             nil,
		"FirstName":        nil,
		"LastName":         nil,
		"Email":            nil,
		"Phone":            nil,
		"HasResponded":     false,
		"CampaignId_Name":  nil,
	}

	campaigns := map[string]models.SObject{
		"cmp-001": {constants.FieldName: "Spring Launch"},
	}
	leads := map[string]models.SObject{
		"lead-001": {
			"FirstName": "Alex",
			"LastName":  "Viderman",
			"Email":     "alex@example.com",
			"Phone":     "123-456",
			"Company":   "PingCAP",
			"Status":    "Working",
		},
	}
	statuses := map[string]map[string]bool{
		"cmp-001": {"responded": true},
	}

	// apply the same inner logic as the handler batch path
	fillRelatedFormulaFields(record, map[string]models.SObject{
		"Campaign": campaigns["cmp-001"],
		"Lead":     leads["lead-001"],
	})
	if isBlank(record["Name"]) {
		record["Name"] = compoundDisplayName(leads["lead-001"])
	}
	if isBlank(record["FirstName"]) {
		record["FirstName"] = recordStringValue(leads["lead-001"], "FirstName")
	}
	if isBlank(record["LastName"]) {
		record["LastName"] = recordStringValue(leads["lead-001"], "LastName")
	}
	if isBlank(record["Email"]) {
		record["Email"] = recordStringValue(leads["lead-001"], "Email")
	}
	if isBlank(record["Phone"]) {
		record["Phone"] = recordStringValue(leads["lead-001"], "Phone")
	}
	if isBlank(record["CompanyOrAccount"]) {
		record["CompanyOrAccount"] = recordStringValue(leads["lead-001"], "Company")
	}
	record["CampaignId_Name"] = recordStringValue(campaigns["cmp-001"], constants.FieldName)
	record["HasResponded"] = statuses["cmp-001"]["responded"]

	assert.Equal(t, "Alex Viderman", record["Name"])
	assert.Equal(t, "Alex", record["FirstName"])
	assert.Equal(t, "Viderman", record["LastName"])
	assert.Equal(t, "alex@example.com", record["Email"])
	assert.Equal(t, "123-456", record["Phone"])
	assert.Equal(t, "PingCAP", record["CompanyOrAccount"])
	assert.Equal(t, "Spring Launch", record["Campaign_Name__c"])
	assert.Equal(t, "Working", record["Lead_Status__c"])
	assert.Equal(t, "Spring Launch", record["CampaignId_Name"])
	assert.Equal(t, true, record["HasResponded"])
}
