package clusterrecovery

import (
	"bytes"
	"encoding/json"
	"testing"
	"time"
)

func TestDecodeAndVerifyReceipt(t *testing.T) {
	now := time.Date(2026, 8, 4, 6, 0, 0, 0, time.UTC)
	receipt := &Receipt{
		SchemaVersion:        SchemaVersion,
		Environment:          StagingEnvironment,
		RunID:                "staging-receipt-test",
		ManifestHash:         stringsOf('a', 64),
		MutationClass:        MutationCreate,
		Phase:                ApplyPhaseCanary,
		Limit:                1,
		ApprovalRefHash:      stringsOf('b', 64),
		WorkloadIdentityHash: stringsOf('c', 64),
		RollbackBundleHash:   stringsOf('d', 64),
		StartedAt:            now,
		CompletedAt:          now.Add(time.Second),
		Results: []ExecutionResult{{
			ActionIndex:   0,
			Kind:          ObjectKindMgmtCluster,
			ClusterID:     "1",
			Outcome:       MutationOutcomeApplied,
			AfterChecksum: stringsOf('e', 64),
		}},
	}
	if err := FinalizeReceipt(receipt); err != nil {
		t.Fatal(err)
	}
	payload, err := json.Marshal(receipt)
	if err != nil {
		t.Fatal(err)
	}
	decoded, err := DecodeReceipt(bytes.NewReader(payload))
	if err != nil {
		t.Fatalf("DecodeReceipt() error = %v", err)
	}
	if err := VerifyReceipt(decoded, receipt.ReceiptHash); err != nil {
		t.Fatalf("VerifyReceipt() error = %v", err)
	}
}

func TestDecodeReceiptRejectsUnknownField(t *testing.T) {
	_, err := DecodeReceipt(bytes.NewBufferString(`{"schema_version":"clinic-staging-recovery/v1","unexpected":true}`))
	if err == nil {
		t.Fatal("expected strict receipt decoding to fail")
	}
}
