package k8sresource

import (
	"testing"

	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
)

func TestValidateRequest(t *testing.T) {
	tests := []struct {
		name    string
		req     *regionalpb.ListK8SResourcesRequest
		wantErr bool
	}{
		{
			name:    "nil request",
			req:     nil,
			wantErr: true,
		},
		{
			name: "control plane ok",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
			},
		},
		{
			name: "data plane requires data_plane",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_DATA_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
			},
			wantErr: true,
		},
		{
			name: "data plane with project_id",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_DATA_PLANE,
				DataPlane: &regionalpb.DataPlane{ProjectId: "p1"},
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
			},
		},
		{
			name: "plane_type unspecified",
			req: &regionalpb.ListK8SResourcesRequest{
				Gvk:      &regionalpb.GVK{Kind: "Pod"},
				Selector: &regionalpb.Selector{},
			},
			wantErr: true,
		},
		{
			name: "gvk nil",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Selector:  &regionalpb.Selector{},
			},
			wantErr: true,
		},
		{
			name: "gvk kind empty",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "  "},
				Selector:  &regionalpb.Selector{},
			},
			wantErr: true,
		},
		{
			name: "selector nil",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
			},
			wantErr: true,
		},
		{
			name: "data plane with cluster_id only",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_DATA_PLANE,
				DataPlane: &regionalpb.DataPlane{ClusterId: "c1"},
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
			},
		},
		{
			name: "events requires detail",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
				Option:    &regionalpb.Option{Events: true},
			},
			wantErr: true,
		},
		{
			name: "max_items exceeds summary limit",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
				Option:    &regionalpb.Option{MaxItems: 1001},
			},
			wantErr: true,
		},
		{
			name: "max_items exceeds detail limit",
			req: &regionalpb.ListK8SResourcesRequest{
				PlaneType: regionalpb.PlaneType_CONTROL_PLANE,
				Gvk:       &regionalpb.GVK{Kind: "Pod"},
				Selector:  &regionalpb.Selector{},
				Option:    &regionalpb.Option{Detail: true, MaxItems: 101},
			},
			wantErr: true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := validateRequest(tt.req)
			if (err != nil) != tt.wantErr {
				t.Fatalf("validateRequest() error = %v, wantErr %v", err, tt.wantErr)
			}
			if err != nil {
				if _, ok := err.(bizerr.Error); !ok {
					t.Fatalf("expected bizerr.Error, got %T", err)
				}
			}
		})
	}
}
