package dag

import (
	"testing"

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

func TestPauseResumeConflictPlansIncludeBRWorkflows(t *testing.T) {
	backupRestorePlans := []string{
		PlanCreateManualBackup, PlanDeleteManualBackup,
		PlanCreateManualBackupRestore, PlanDeleteManualBackupRestore,
		PlanCreateManualBackupXRestore, PlanDeleteManualBackupXRestore,
		PlanCreateLightweightRestore, PlanDeleteLightweightRestore,
		PlanCreateLightweightXRestore, PlanDeleteLightweightXRestore,
		PlanCreateClassicRestore, PlanDeleteClassicRestore,
		PlanUpdateBackupGcSetting,
	}
	require.ElementsMatch(t, backupRestorePlans, PauseResumeBackupRestorePlans())
	plans := PauseResumeConflictPlans()
	require.ElementsMatch(t, backupRestorePlans, intersection(plans, backupRestorePlans))
}

func TestPauseResumeConflictPlansComposeValidationGroupsInOrder(t *testing.T) {
	want := append([]string{}, PauseResumeResourceMutationPlans()...)
	want = append(want, PauseResumeTiBRUpgradePlans()...)
	want = append(want, PauseResumeDMPlans()...)
	want = append(want, PauseResumeBackupRestorePlans()...)
	require.Equal(t, want, PauseResumeConflictPlans())
}

func TestPauseResumeResourceMutationPlansIncludeDeleteTiKVGroup(t *testing.T) {
	require.Contains(t, PauseResumeResourceMutationPlans(), PlanDeleteTiKVGroup)
}

func intersection(plans, expected []string) []string {
	set := make(map[string]struct{}, len(plans))
	for _, plan := range plans {
		set[plan] = struct{}{}
	}
	var found []string
	for _, plan := range expected {
		if _, ok := set[plan]; ok {
			found = append(found, plan)
		}
	}
	return found
}
