package helm

import (
	"testing"

	"helm.sh/helm/v3/pkg/chart"
	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)

type stubPackage struct {
	values map[string]interface{}
}

func (p *stubPackage) GetName() string {
	return "test"
}

func (p *stubPackage) GetCRDs() ([]*apiextensionsv1.CustomResourceDefinition, error) {
	return nil, nil
}

func (p *stubPackage) GetNamespace() string {
	return "default"
}

func (p *stubPackage) ToHelmChart() (*chart.Chart, error) {
	return &chart.Chart{}, nil
}

func (p *stubPackage) ToHelmValues() map[string]interface{} {
	return p.values
}

func TestWithPodLabels(t *testing.T) {
	base := &stubPackage{
		values: map[string]interface{}{
			"podLabels": map[string]interface{}{
				"existing": "label",
			},
		},
	}

	wrapped := WithPodLabels(base, map[string]string{
		"tags.tidbcloud.com/shared-pool": "pool-1",
	})

	values := wrapped.ToHelmValues()
	podLabels, ok := values["podLabels"].(map[string]interface{})
	if !ok {
		t.Fatalf("podLabels type = %T, want map[string]interface{}", values["podLabels"])
	}
	if got := podLabels["existing"]; got != "label" {
		t.Fatalf("existing label = %v, want label", got)
	}
	if got := podLabels["tags.tidbcloud.com/shared-pool"]; got != "pool-1" {
		t.Fatalf("shared-pool label = %v, want pool-1", got)
	}

	originalPodLabels := base.values["podLabels"].(map[string]interface{})
	if _, ok := originalPodLabels["tags.tidbcloud.com/shared-pool"]; ok {
		t.Fatalf("base package podLabels mutated: %#v", originalPodLabels)
	}
}
