package test

import (
	"github.com/rook/rook/pkg/clusterd"
	"github.com/rook/rook/pkg/operator/ceph/version"
	apps "k8s.io/api/apps/v1"
)

// UpdateDeploymentAndWaitStub returns a stub replacement for the UpdateDeploymentAndWait function
// for unit tests which always returns success (nil). The generated simple clientset doesn't seem to
// handle the Deployment.Update method as expected. The deployment is instead zero-ed out when the
// deployment is updated with an unchanged version, which breaks unit tests.
// In order to still test the UpdateDeploymentAndWait function, the stub function returned will
// append a copy of the deployment used as input to the list of deployments updated. The function
// returns a pointer to this slice which the calling func may use to verify the expected contents of
// deploymentsUpdated based on expected behavior.
func UpdateDeploymentAndWaitStub() (
	stubFunc func(context *clusterd.Context, deployment *apps.Deployment, namespace, daemonType, daemonName string, cephVersion version.CephVersion, isUpgrade, skipUpgradeChecks, continueUpgradeAfterChecksEvenIfNotHealthy bool) error,
	deploymentsUpdated *[]*apps.Deployment,
) {
	deploymentsUpdated = &[]*apps.Deployment{}
	stubFunc = func(context *clusterd.Context, deployment *apps.Deployment, namespace, daemonType, daemonName string, cephVersion version.CephVersion, isUpgrade, skipUpgradeChecks, continueUpgradeAfterChecksEvenIfNotHealthy bool) error {
		*deploymentsUpdated = append(*deploymentsUpdated, deployment)
		return nil
	}
	return stubFunc, deploymentsUpdated
}

// DeploymentNamesUpdated converts a deploymentsUpdated slice into a string slice of deployment names
func DeploymentNamesUpdated(deploymentsUpdated *[]*apps.Deployment) []string {
	ns := []string{}
	for _, d := range *deploymentsUpdated {
		ns = append(ns, d.GetName())
	}
	return ns
}

// ClearDeploymentsUpdated clears the deploymentsUpdated list
func ClearDeploymentsUpdated(deploymentsUpdated *[]*apps.Deployment) {
	*deploymentsUpdated = []*apps.Deployment{}
}
