package controller

import (
	"sort"

	"github.com/argoproj/argo-cd/gitops-engine/pkg/sync/syncwaves"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

type syncWaveSorter []*unstructured.Unstructured

func (s syncWaveSorter) Len() int {
	return len(s)
}

func (s syncWaveSorter) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}

func (s syncWaveSorter) Less(i, j int) bool {
	return syncwaves.Wave(s[i]) < syncwaves.Wave(s[j])
}

func FilterObjectsForDeletion(objs []*unstructured.Unstructured) []*unstructured.Unstructured {
	if len(objs) <= 1 {
		return objs
	}

	sort.Sort(sort.Reverse(syncWaveSorter(objs)))

	currentSyncWave := syncwaves.Wave(objs[0])
	filteredObjs := make([]*unstructured.Unstructured, 0)
	for _, obj := range objs {
		if syncwaves.Wave(obj) != currentSyncWave {
			break
		}
		filteredObjs = append(filteredObjs, obj)
	}
	return filteredObjs
}
