package specdrift

import (
	"encoding/json"
	"strings"
	"testing"

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

func TestPicklistOptionsMatchComparesExtensions(t *testing.T) {
	specOptions := models.PicklistOptions{
		{Value: "Negotiation", Label: "Negotiation", Extensions: map[string]json.RawMessage{
			"defaultProbability": json.RawMessage("60"),
		}},
	}

	if picklistOptionsMatch(specOptions, `[{"value":"Negotiation","label":"Negotiation","extensions":{}}]`) {
		t.Fatal("picklistOptionsMatch = true when live extension is missing, want false")
	}
	if picklistOptionsMatch(specOptions, `[{"value":"Negotiation","label":"Negotiation","extensions":{"defaultProbability":50}}]`) {
		t.Fatal("picklistOptionsMatch = true when live extension differs, want false")
	}
	liveOptions := models.PicklistOptions{
		{Value: "Negotiation", Label: "Negotiation", Extensions: map[string]json.RawMessage{
			"defaultProbability": json.RawMessage("50"),
		}},
	}
	if diff := comparePicklistOptions(specOptions, stringPtr(mustMarshalPicklistOptions(t, liveOptions))); !strings.Contains(diff, "Extensions[Negotiation]") {
		t.Fatalf("diff = %q, want Extensions mismatch", diff)
	}
	if !picklistOptionsMatch(specOptions, `[{"value":"Negotiation","label":"Negotiation","extensions":{"defaultProbability":60.0}}]`) {
		t.Fatal("picklistOptionsMatch = false for semantically matching extension JSON, want true")
	}
}

func mustMarshalPicklistOptions(t *testing.T, opts models.PicklistOptions) string {
	t.Helper()
	raw, err := opts.MarshalJSON()
	if err != nil {
		t.Fatalf("marshal picklist options: %v", err)
	}
	return string(raw)
}

func stringPtr(value string) *string {
	return &value
}
