package persistence

import (
	"bytes"
	"testing"

	"github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/permissionstatev1"
)

func newPermissionStateAuthorityForTest(t *testing.T, transactions *TransactionManager) *PermissionStateAuthority {
	t.Helper()
	authority, err := NewPermissionStateAuthority(transactions)
	if err != nil {
		t.Fatal(err)
	}
	return authority
}

func assertPermissionStateReceipt(
	t *testing.T,
	receipt permissionstatev1.AdvanceReceipt,
	lineage []byte,
	before uint64,
	after uint64,
) {
	t.Helper()
	if !bytes.Equal(receipt.BeforeVersion().Lineage().Bytes(), lineage) ||
		!bytes.Equal(receipt.AfterVersion().Lineage().Bytes(), lineage) ||
		receipt.BeforeVersion().Revision() != before ||
		receipt.AfterVersion().Revision() != after {
		t.Fatalf(
			"receipt = lineage %v/%v revisions %d/%d, want lineage %v revisions %d/%d",
			receipt.BeforeVersion().Lineage().Bytes(),
			receipt.AfterVersion().Lineage().Bytes(),
			receipt.BeforeVersion().Revision(),
			receipt.AfterVersion().Revision(),
			lineage,
			before,
			after,
		)
	}
}

func assertPermissionStateReceiptEqual(t *testing.T, got, want permissionstatev1.AdvanceReceipt) {
	t.Helper()
	gotBytes, err := got.MarshalBinary()
	if err != nil {
		t.Fatal(err)
	}
	wantBytes, err := want.MarshalBinary()
	if err != nil {
		t.Fatal(err)
	}
	if !bytes.Equal(gotBytes, wantBytes) {
		t.Fatalf("receipt = %x, want %x", gotBytes, wantBytes)
	}
}
