// Package componentbehavior owns neutral canonical behavior codecs used by
// content-addressed App components.
package componentbehavior

import (
	"bytes"
	"encoding/json"
	"errors"

	"github.com/pingcap-inc/nexuscrm-controlplane/strictjson"
)

var ErrNotJSON = errors.New("component behavior is not JSON")

// CanonicalJSONV1 preserves exact JSON numbers, rejects duplicate keys, and
// produces one deterministic compact object representation. Component-kind
// owners opt into this codec explicitly; the codec does not register kinds.
func CanonicalJSONV1(payload []byte) ([]byte, error) {
	if !json.Valid(payload) {
		return nil, ErrNotJSON
	}
	if err := strictjson.RejectDuplicateKeys(payload, "component_behavior"); err != nil {
		return nil, err
	}
	decoder := json.NewDecoder(bytes.NewReader(payload))
	decoder.UseNumber()
	var decoded any
	if err := decoder.Decode(&decoded); err != nil {
		return nil, err
	}
	return json.Marshal(decoded)
}
