package target

import (
	"reflect"
	"testing"

	"github.com/tidbcloud/cluster-service-ng/internal/capacity-planner/api/v1alpha1"
)

func TestPodTargetReturnsNamespaceAndSelectorLabels(t *testing.T) {
	target, err := NewPodTargetForRef("dp-x", v1alpha1.CrossVersionObjectReference{
		APIVersion: "core.pingcap.com/v1alpha1",
		Kind:       "TiDBGroup",
		Name:       "tidb",
	})
	if err != nil {
		t.Fatalf("NewPodTargetForRef() error = %v", err)
	}

	if target.Namespace() != "dp-x" {
		t.Fatalf("Namespace() = %q, want dp-x", target.Namespace())
	}
	want := map[string]string{
		LabelGroup:     "tidb",
		LabelComponent: "tidb",
	}
	if got := target.Labels(); !reflect.DeepEqual(got, want) {
		t.Fatalf("Labels() = %v, want %v", got, want)
	}

	got := target.Labels()
	got[LabelGroup] = "mutated"
	if target.Labels()[LabelGroup] != "tidb" {
		t.Fatal("Labels() must return a defensive copy")
	}
}

func TestNewPodTargetForRefRejectsInvalidInput(t *testing.T) {
	validRef := v1alpha1.CrossVersionObjectReference{
		APIVersion: "core.pingcap.com/v1alpha1",
		Kind:       "TiDBGroup",
		Name:       "tidb",
	}

	if _, err := NewPodTargetForRef("", validRef); err == nil {
		t.Fatal("empty namespace must be rejected")
	}
	noAPIVersion := validRef
	noAPIVersion.APIVersion = ""
	if _, err := NewPodTargetForRef("dp-x", noAPIVersion); err == nil {
		t.Fatal("empty targetRef.apiVersion must be rejected")
	}
	if _, err := NewPodTargetForRef("dp-x", v1alpha1.CrossVersionObjectReference{APIVersion: "core.pingcap.com/v1alpha1", Kind: "UnknownGroup", Name: "db"}); err == nil {
		t.Fatal("unsupported target kind must be rejected")
	}
	if _, err := NewPodTargetForRef("dp-x", v1alpha1.CrossVersionObjectReference{APIVersion: "core.pingcap.com/v1alpha1", Kind: "TiDBGroup"}); err == nil {
		t.Fatal("empty targetRef.name must be rejected")
	}
}
