package cluster

import (
	"strings"

	"github.com/pingcap-inc/clinic/pkg/auth/session"
	"github.com/pingcap-inc/clinic/pkg/datasource/view"
	"github.com/pingcap-inc/clinic/pkg/db"
	"github.com/pingcap-inc/clinic/pkg/o11y"
)

func redactExternalDedicatedResourcePoolComponents(
	user *session.CtxUser,
	cluster *db.Cluster,
	components []*view.ResourcePoolComponent,
) ([]*view.ResourcePoolComponent, bool) {
	if !shouldRedactExternalDedicatedResourcePoolComponents(user, cluster) {
		return components, false
	}

	redacted := make([]*view.ResourcePoolComponent, 0, len(components))
	for _, component := range components {
		if component == nil {
			redacted = append(redacted, nil)
			continue
		}
		componentType := strings.TrimPrefix(
			strings.ToUpper(strings.TrimSpace(string(component.ComponentType))),
			"COMPONENT_TYPE_",
		)
		if componentType == "PD" {
			continue
		}

		componentCopy := *component
		componentCopy.Storages = nil
		redacted = append(redacted, &componentCopy)
	}
	return redacted, true
}

func shouldRedactExternalDedicatedResourcePoolComponents(user *session.CtxUser, cluster *db.Cluster) bool {
	return user != nil && cluster != nil && !user.Internal && cluster.DeployTypeV2 == o11y.DeployTypeV2Dedicated
}
