package k8sresource

import (
	"testing"

	"k8s.io/apimachinery/pkg/runtime/schema"
)

func TestLookupBuiltin(t *testing.T) {
	tests := []struct {
		name          string
		kind          string
		wantCanonical string
		wantGroup     string
		wantVersion   string
		wantOK        bool
	}{
		{
			name:          "core pod case insensitive",
			kind:          " pod ",
			wantCanonical: "Pod",
			wantGroup:     "",
			wantVersion:   "v1",
			wantOK:        true,
		},
		{
			name:          "apps deployment lowercase",
			kind:          "deployment",
			wantCanonical: "Deployment",
			wantGroup:     "apps",
			wantVersion:   "v1",
			wantOK:        true,
		},
		{
			name:   "unknown kind",
			kind:   "UnknownCRD",
			wantOK: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			canonical, gv, ok := lookupBuiltin(tt.kind)
			if ok != tt.wantOK {
				t.Fatalf("lookupBuiltin() ok = %v, want %v", ok, tt.wantOK)
			}
			if !tt.wantOK {
				return
			}
			if canonical != tt.wantCanonical {
				t.Fatalf("canonical = %q, want %q", canonical, tt.wantCanonical)
			}
			if gv.group != tt.wantGroup || gv.version != tt.wantVersion {
				t.Fatalf("gv = {%q,%q}, want {%q,%q}", gv.group, gv.version, tt.wantGroup, tt.wantVersion)
			}
		})
	}
}

func TestGVKCompatible(t *testing.T) {
	table := builtinGV{group: "apps", version: "v1"}
	if !gvkCompatible("", "", table) {
		t.Fatal("empty user group/version should be compatible")
	}
	if !gvkCompatible("apps", "v1", table) {
		t.Fatal("matching group/version should be compatible")
	}
	if gvkCompatible("batch", "", table) {
		t.Fatal("conflicting group should not be compatible")
	}
	if gvkCompatible("", "v1beta1", table) {
		t.Fatal("conflicting version should not be compatible")
	}
}

func TestMergeBuiltinGVK(t *testing.T) {
	table := builtinGV{group: "apps", version: "v1"}
	got := mergeBuiltinGVK("Deployment", "", "", table)
	want := schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}
	if got != want {
		t.Fatalf("mergeBuiltinGVK() = %+v, want %+v", got, want)
	}

	got = mergeBuiltinGVK("Deployment", "apps", "v1", table)
	if got != want {
		t.Fatalf("mergeBuiltinGVK() with explicit gv = %+v, want %+v", got, want)
	}
}
