package testtoken

import (
	"context"
	"os"
	"testing"

	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/config-service/sdk/api"
	"github.com/tidbcloud/idl/pbgen/proto/central"
)

const (
	defaultGlobalVersion = "test-v4.0.6"
)

type fakeConfigService struct {
}

func (f *fakeConfigService) DescribeClusterConfiguration(*api.DescribeClusterConfigInput) (*api.DescribeClusterConfigOutput, error) {
	components := []api.ComponentOutput{
		{
			Image:     api.Image{BaseImage: "tikv-base-image"},
			Component: api.ComponentTiKV,
		},
		{
			Image:     api.Image{BaseImage: "pd-base-image"},
			Component: api.ComponentPD,
		},
		{
			Image:     api.Image{BaseImage: "tidb-base-image"},
			Component: api.ComponentTiDB,
		},
		{
			Image:     api.Image{BaseImage: "tiflash-base-image"},
			Component: api.ComponentTiFlash,
		},
	}

	output := &api.DescribeClusterConfigOutput{
		Version:    defaultGlobalVersion,
		Components: components,
	}

	return output, nil
}

func (f *fakeConfigService) DescribeBackupConfiguration(*api.DescribeBRConfigInput) (*api.DescribeBRConfigOutput, error) {
	tag := "tag"
	output := &api.DescribeBRConfigOutput{
		Version: "test-br-version",
		Image: api.Image{
			BaseImage: "base-image",
			Tag:       &tag,
		},
	}

	return output, nil
}

func (f *fakeConfigService) DescribeRestoreConfiguration(*api.DescribeBRConfigInput) (*api.DescribeBRConfigOutput, error) {
	tag := "tag"
	output := &api.DescribeBRConfigOutput{
		Version: "test-br-version",
		Image: api.Image{
			BaseImage: "base-image",
			Tag:       &tag,
		},
	}

	return output, nil
}

func TestGetTenantCustomizedImage(t *testing.T) {
	req := central.GetTenantCustomizedImageReq{TenantId: entity.PingCAPTenantID.Uint64()}
	ctx := context.TODO()

	s := testTokenService{}
	resp, err := s.GetTenantCustomizedImage(ctx, &req)
	t.Logf("GetTenantCustomizedImage, resp: %+v", resp)
	assert.Nil(t, err)
	assert.Greater(t, len(resp.PdImage.Tag), 1)
	assert.Greater(t, len(resp.TikvImage.Tag), 1)
	assert.Greater(t, len(resp.TidbImage.Tag), 1)
	assert.Greater(t, len(resp.TiflashImage.Tag), 1)
	assert.Greater(t, len(resp.BackupImage.Tag), 1)
	assert.Greater(t, len(resp.RestoreImage.Tag), 1)
	assert.Equal(t, defaultGlobalVersion, resp.TikvImage.Tag)
	assert.Equal(t, "tag", resp.BackupImage.Tag)
}

func TestMain(m *testing.M) {
	// set isUnitTest to true
	isUnitTest = true
	configService = &fakeConfigService{}

	os.Exit(m.Run())
}
