package protocol

import "testing"

func TestCanonicalJSONIsStableForMapOrder(t *testing.T) {
	bodyA := map[string]any{
		"version": "0.1.0",
		"resources": map[string]any{
			"memory": 1024,
			"cpu":    8,
		},
		"capabilities": []any{"heartbeat", "report"},
	}
	bodyB := map[string]any{
		"capabilities": []any{"heartbeat", "report"},
		"resources": map[string]any{
			"cpu":    8,
			"memory": 1024,
		},
		"version": "0.1.0",
	}

	jsonA, err := CanonicalJSON(bodyA)
	if err != nil {
		t.Fatalf("canonical json A: %v", err)
	}
	jsonB, err := CanonicalJSON(bodyB)
	if err != nil {
		t.Fatalf("canonical json B: %v", err)
	}

	if string(jsonA) != string(jsonB) {
		t.Fatalf("canonical json mismatch:\nA=%s\nB=%s", jsonA, jsonB)
	}
	if BodySHA256(jsonA) != BodySHA256(jsonB) {
		t.Fatalf("body hash mismatch")
	}
}

func TestSignatureChangesWithPath(t *testing.T) {
	secret := "ias_test_secret"
	bodyHash := BodySHA256([]byte(`{"ok":true}`))
	payloadA := SigningPayload("POST", "/api/agent/heartbeat", "1777380000000", "nonce-123456", bodyHash)
	payloadB := SigningPayload("POST", "/api/agent/report", "1777380000000", "nonce-123456", bodyHash)

	if Signature(secret, payloadA) == Signature(secret, payloadB) {
		t.Fatalf("signature should change when request path changes")
	}
}
