package clusteraction

import (
	"reflect"
	"testing"

	apiv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/cluster-agent/v1"

	opent "github.com/tidbcloud/devops/entity/operation"
)

const (
	testClusterID = "12345"
)

func buildTestInstance(withClusterID bool, params map[opent.ParamName]string) *opent.Instance {
	ret := &opent.Instance{
		ID:     0,
		Params: map[opent.ParamName]string{},
	}
	if withClusterID {
		ret.Params[opent.ParamClusterID] = testClusterID
	}
	for k, v := range params {
		ret.Params[k] = v
	}
	return ret
}

func Test_restart_getParam(t *testing.T) {
	tests := []struct {
		name     string
		instance *opent.Instance
		want     *apiv1.RestartReq
		wantErr  bool
	}{
		{
			name:     "no cluster id",
			instance: buildTestInstance(false, nil),
			wantErr:  true,
		},
		{
			name: "invalid restart target type",
			instance: buildTestInstance(true, map[opent.ParamName]string{
				opent.ParamRestartTargetType: "tidb",
			}),
			wantErr: true,
		},
		{
			name: "without db prefix",
			instance: buildTestInstance(true, map[opent.ParamName]string{
				opent.ParamRestartTargetType: "pod",
				opent.ParamRestartTarget:     "tidb-12",
			}),
			want: &apiv1.RestartReq{
				OperationId: "0",
				ClusterId:   testClusterID,
				TargetType:  apiv1.RestartTargetType_POD,
				TargetName:  "db-tidb-12",
				Force:       false,
			},
		},
		{
			name: "with db prefix",
			instance: buildTestInstance(true, map[opent.ParamName]string{
				opent.ParamRestartTargetType: "node",
				opent.ParamRestartTarget:     "db-tidb-12",
			}),
			want: &apiv1.RestartReq{
				OperationId: "0",
				ClusterId:   testClusterID,
				TargetType:  apiv1.RestartTargetType_NODE,
				TargetName:  "db-tidb-12",
				Force:       false,
			},
		},
		{
			name: "restart the cluster",
			instance: buildTestInstance(true, map[opent.ParamName]string{
				opent.ParamRestartTargetType: "cluster",
			}),
			want: &apiv1.RestartReq{
				OperationId: "0",
				ClusterId:   testClusterID,
				TargetType:  apiv1.RestartTargetType_CLUSTER,
				Force:       false,
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			a := &restart{}
			got, err := a.getParam(tt.instance)
			if (err != nil) != tt.wantErr {
				t.Errorf("getParam() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("getParam() got = %v, want %v", got, tt.want)
			}
		})
	}
}
