package cluster

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/chaos-svc/idl/pbgen/proto/chaos"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

func TestBuildTiDBComponentTopology(t *testing.T) {
	tests := []struct {
		name         string
		cluster      *cloudv1.Cluster
		wantTopology *chaos.TiDBComponentTopology
		wantErr      bool
	}{
		{
			name: "include all component",
			cluster: &cloudv1.Cluster{
				Status: cloudv1.ClusterStatus{
					DB: &cloudv1.DBStatus{
						PD: &cloudv1.PDStatus{
							Members: []cloudv1.PDMember{
								{Name: "pd-1"},
								{Name: "pd-x"},
							},
						},
						TiDB: &cloudv1.TiDBStatus{
							Members: []cloudv1.TiDBMember{
								{Name: "tidb-2"},
								{Name: "tidb-x"},
							},
						},
						TiKV: &cloudv1.TiKVStatus{
							Members: []cloudv1.StoreMember{
								{Name: "tikv-0"},
								{Name: "tikv-1"},
								{Name: "tikv-2"},
							},
						},
						TiFlash: &cloudv1.TiFlashStatus{
							Members: []cloudv1.StoreMember{
								{Name: "tiflash-2"},
							},
						},
					},
				},
			},
			wantTopology: &chaos.TiDBComponentTopology{
				Pd: []*chaos.ComponentPodInfo{
					{Name: "pd-1"},
					{Name: "pd-x"},
				},
				Tidb: []*chaos.ComponentPodInfo{
					{Name: "tidb-2"},
					{Name: "tidb-x"},
				},
				Tikv: []*chaos.ComponentPodInfo{
					{Name: "tikv-0"},
					{Name: "tikv-1"},
					{Name: "tikv-2"},
				},
				Tiflash: []*chaos.ComponentPodInfo{
					{Name: "tiflash-2"},
				},
			},
			wantErr: false,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			gotTopology, err := buildTiDBComponentTopology(test.cluster)
			if (err != nil) != test.wantErr {
				t.Errorf("buildTiDBComponentTopology() error = %v, wantErr = %v", err, test.wantErr)
				return
			}

			assert.Equal(t, gotTopology, test.wantTopology, "buildTiDBComponentTopology() got = %v, want %v", gotTopology, test.wantTopology)
		})
	}
}
