package layoutownership

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

func TestDecodePageLayoutConfigPreservesExtensionNumberLexemes(t *testing.T) {
	raw := []byte(`{"id":"layout-1","objectApiName":"Account","headerActions":[{"name":"Run","config":{"scale":12.50,"large":9007199254740993,"precise":0.123456789012345678901234567890}}]}`)
	layout, err := DecodePageLayoutConfig(raw)
	if err != nil {
		t.Fatalf("DecodePageLayoutConfig: %v", err)
	}
	config := layout.HeaderActions[0].Config
	for key, want := range map[string]string{
		"scale":   "12.50",
		"large":   "9007199254740993",
		"precise": "0.123456789012345678901234567890",
	} {
		got, ok := config[key].(json.Number)
		if !ok || got.String() != want {
			t.Fatalf("config[%q] = %#v (%T), want json.Number(%q)", key, config[key], config[key], want)
		}
	}

	reencoded, err := json.Marshal(layout)
	if err != nil {
		t.Fatalf("json.Marshal: %v", err)
	}
	decodedAgain, err := DecodePageLayoutConfig(reencoded)
	if err != nil {
		t.Fatalf("DecodePageLayoutConfig(reencoded): %v", err)
	}
	for key, want := range map[string]string{
		"scale":   "12.50",
		"large":   "9007199254740993",
		"precise": "0.123456789012345678901234567890",
	} {
		if got := decodedAgain.HeaderActions[0].Config[key].(json.Number).String(); got != want {
			t.Fatalf("reencoded config[%q] = %q, want %q", key, got, want)
		}
	}
}

func TestDecodePageLayoutConfigStrictPreservesNumbersAndRejectsUnknownFields(t *testing.T) {
	raw := []byte(`{"id":"layout-1","objectApiName":"Account","headerActions":[{"name":"Run","config":{"scale":12.50,"large":9007199254740993}}]}`)
	layout, err := DecodePageLayoutConfigStrict(raw)
	if err != nil {
		t.Fatalf("DecodePageLayoutConfigStrict: %v", err)
	}
	for key, want := range map[string]string{
		"scale": "12.50",
		"large": "9007199254740993",
	} {
		got, ok := layout.HeaderActions[0].Config[key].(json.Number)
		if !ok || got.String() != want {
			t.Fatalf("strict config[%q] = %#v (%T), want json.Number(%q)", key, layout.HeaderActions[0].Config[key], layout.HeaderActions[0].Config[key], want)
		}
	}

	unknown := []byte(`{"id":"layout-1","objectApiName":"Account","unknownField":true}`)
	if _, err := DecodePageLayoutConfigStrict(unknown); err == nil || !strings.Contains(err.Error(), "unknown field") {
		t.Fatalf("DecodePageLayoutConfigStrict unknown field error = %v, want rejection", err)
	}
	if _, err := DecodePageLayoutConfig(unknown); err != nil {
		t.Fatalf("DecodePageLayoutConfig should retain non-strict compatibility: %v", err)
	}
}
