package k8sresource

import (
	"strings"
	"testing"

	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
	"k8s.io/apimachinery/pkg/runtime/schema"
)

func TestCheckGKAllowed(t *testing.T) {
	tests := []struct {
		name    string
		gvk     schema.GroupVersionKind
		wantErr bool
		errMsg  string
	}{
		{
			name:    "unknown group",
			gvk:     schema.GroupVersionKind{Group: "unknown.example.com", Kind: "Foo"},
			wantErr: true,
			errMsg:  `group "unknown.example.com" is not allowed`,
		},
		{
			name:    "core secret denied",
			gvk:     schema.GroupVersionKind{Group: "", Kind: "Secret"},
			wantErr: true,
			errMsg:  `kind "Secret" in group "core" is not allowed`,
		},
		{
			name: "core pod allowed",
			gvk:  schema.GroupVersionKind{Group: "", Kind: "Pod"},
		},
		{
			name: "apps deployment allowed",
			gvk:  schema.GroupVersionKind{Group: "apps", Kind: "Deployment"},
		},
		{
			name:    "aws crossplane providerconfig denied",
			gvk:     schema.GroupVersionKind{Group: "aws.crossplane.io", Kind: "ProviderConfig"},
			wantErr: true,
			errMsg:  `kind "ProviderConfig" in group "aws.crossplane.io" is not allowed`,
		},
		{
			name: "aws crossplane other kind allowed",
			gvk:  schema.GroupVersionKind{Group: "aws.crossplane.io", Kind: "Bucket"},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := CheckGKAllowed(tt.gvk)
			if (err != nil) != tt.wantErr {
				t.Fatalf("CheckGKAllowed() error = %v, wantErr %v", err, tt.wantErr)
			}
			if err != nil {
				be, ok := err.(bizerr.Error)
				if !ok {
					t.Fatalf("expected bizerr.Error, got %T", err)
				}
				if tt.errMsg != "" && !strings.Contains(be.Error(), tt.errMsg) {
					t.Fatalf("CheckGKAllowed() error = %q, want substring %q", be.Error(), tt.errMsg)
				}
			}
		})
	}
}

func TestFormatGroup(t *testing.T) {
	if got := formatGroup(""); got != "core" {
		t.Fatalf("formatGroup(\"\") = %q, want %q", got, "core")
	}
	if got := formatGroup("apps"); got != "apps" {
		t.Fatalf("formatGroup(\"apps\") = %q, want %q", got, "apps")
	}
}
