package roles

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestRealizationResultExposesAuthorityVersion(t *testing.T) {
	result := RealizationResult{RoleID: "role_1", roleVersionID: "rlv_authority"}
	require.Equal(t, "rlv_authority", result.RoleVersionID())
}

func TestApplyOperationAndReceiptReplayExposeAuthorityVersion(t *testing.T) {
	ownership := &testAgentOwnershipSource{owned: map[string]bool{"agt_1": true}}
	service := newRoleServiceForTest(t, Options{Ownership: ownership})
	ctx := context.Background()
	role, err := service.CreateRole(ctx, "wsp_1", "usr_1", Mutation{
		Name: "Reviewer", Definition: "review",
	})
	require.NoError(t, err)
	operation := MutationOperation{
		OperationKey: "apply-authority-version", RequestDigest: digestForTest("apply-authority-version"),
	}
	input := RealizationRequest{
		AgentID: "agt_1", RoleVersionID: role.RoleVersionID, Apply: true,
	}

	applied, err := service.ApplyRoleOperation(ctx, "wsp_1", "usr_1", role.ID, operation, input)
	require.NoError(t, err)
	require.Equal(t, role.RoleVersionID, applied.RoleVersionID())

	description := "new active version"
	_, err = service.UpdateRoleOperation(
		ctx, "wsp_1", "usr_1", role.ID,
		MutationOperation{OperationKey: "advance-after-apply-accessor", RequestDigest: digestForTest("advance")},
		role.RoleVersionID, RoleUpdatePatch{Description: &description},
	)
	require.NoError(t, err)
	replayed, err := service.ApplyRoleOperation(ctx, "wsp_1", "usr_1", role.ID, operation, input)
	require.NoError(t, err)
	require.Equal(t, role.RoleVersionID, replayed.RoleVersionID())
}
