package orchestrator

import (
	"testing"
	"time"

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

func validApprovalRequest() ApprovalRequest {
	return ApprovalRequest{
		WorkspaceID: "wsp_1", PlanID: "pln_1", PlanVersionID: "plv_1",
		RunID: "wri_1", ActivationID: "wra_1", EffectID: "wrf_1", NodeID: "review",
		AssigneeMemberID: "mem_approver", Summary: "Approve release",
		CausedByMemberID: "mem_owner",
	}
}

func TestApprovalRequestValidateRequiresExactFrozenContext(t *testing.T) {
	request := validApprovalRequest()
	require.NoError(t, request.Validate())
	request.AssigneeMemberID = ""
	require.EqualError(t, request.Validate(), "workflow Run approval assigneeMemberId is required")
	request = validApprovalRequest()
	request.Summary = " "
	require.ErrorContains(t, request.Validate(), "summary")
}

func TestApprovalDecisionOnlyAllowsBinaryDecision(t *testing.T) {
	decision := ApprovalDecision{
		WorkspaceID: "wsp_1", EffectID: "wrf_1", NotificationID: "btn_1",
		ActorMemberID: "mem_approver", Decision: ApprovalDecisionApproved,
		ClientDecisionID: "bna_1", DecidedAt: time.Now(),
	}
	require.NoError(t, decision.Validate())
	decision.Decision = "cancel"
	require.ErrorContains(t, decision.Validate(), "approved or rejected")
}

func TestApprovalDecisionResultRequiresAssigneeAsActor(t *testing.T) {
	request := validApprovalRequest()
	result := ApprovalDecisionResult{
		WorkspaceID: request.WorkspaceID, PlanID: request.PlanID, PlanVersionID: request.PlanVersionID,
		RunID: request.RunID, ActivationID: request.ActivationID, EffectID: request.EffectID,
		NodeID: request.NodeID, AssigneeMemberID: request.AssigneeMemberID, Summary: request.Summary,
		Decision:          ApprovalDecisionRejected,
		DecidedByMemberID: request.AssigneeMemberID, DecidedAt: time.Now(),
	}
	require.NoError(t, result.Validate())
	result.DecidedByMemberID = "mem_other"
	require.ErrorContains(t, result.Validate(), "actor")
}
