package tests

import (
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/costexplorer"
	"github.com/pingcap/dbaas/billing2/model/migrate"
	"github.com/pingcap/dbaas/billing2/utils/pp"
)

func (suite *CostExplorerTrendsTestSuite) TestCostExplorerServices() {
	assert := suite.Assert()
	var err error
	err = (&migrate.MigrateModel{}).SetupAllCategoryItem()
	assert.NoError(err)
	res, err := costexplorer.GetCostExplorerServices()
	assert.NoError(err)
	products := []string{"TiDB Serverless", "TiDB Dedicated", "TiDB Cloud Starter", "TiDB Cloud Essential", "TiDB Cloud Premium", "Support Plan"}
	categories := [][]string{{"Row-based Storage", "Columnar Storage", "Request Units"}, {"Node Compute", "Node Storage", "Backup", "Data Migration", "Changefeed", "Data Transfer"}, {"Request Units"}, {"Columnar Storage"}, {"Backup"}, {}}
	components := [][][]string{
		{{}, {}, {}},
		{
			{"TiDB", "TiKV", "TiFlash"},
			{"TiKV", "TiFlash"},
			{"Single Region Storage", "Dual Region Storage", "Replication"},
			{"Replication Capacity Units"},
			{"Replication Capacity Units"},
			{"Internet", "Cross Region", "Same Region", "Load Balancing", "DM NAT Gateway"},
		},
		{{}},
		{{}},
		{{"Single Region Storage"}},
		{},
	}
	var targets []*forms.CostExplorerService
	for i, _ := range products {
		productName := products[i]
		if len(categories[i]) == 0 {
			svc := forms.CostExplorerService{Product: &productName}
			svcName := costexplorer.FormatServiceName(&svc)
			svc.Service = &svcName
			targets = append(targets, &svc)
		}
		for j, _ := range categories[i] {
			cateName := categories[i][j]
			if len(components[i][j]) == 0 {
				svc := forms.CostExplorerService{Product: &productName, Category: &cateName}
				svcName := costexplorer.FormatServiceName(&svc)
				svc.Service = &svcName
				targets = append(targets, &svc)
			}
			for k, _ := range components[i][j] {
				compName := components[i][j][k]
				svc := forms.CostExplorerService{Product: &productName, Category: &cateName, Component: &compName}
				svcName := costexplorer.FormatServiceName(&svc)
				svc.Service = &svcName
				targets = append(targets, &svc)
			}
		}
	}
	pp.Print(res)
	assert.Equal(targets, res)
}

func (suite *CostExplorerTrendsTestSuite) TestCostExplorerProviders() {
	assert := suite.Assert()
	r, err := costexplorer.GetCostExplorerProviders()
	assert.NoError(err)
	assert.Len(r, 3)
	assert.Equal("AWS", r[0].Name)
	assert.Equal([]string{"us-east-1", costexplorer.OthersRegion}, r[0].Regions)
	assert.Equal("GCP", r[1].Name)
	assert.Equal([]string{"us-west-2", costexplorer.OthersRegion}, r[1].Regions)
	assert.Equal("PingCAP", r[2].Name)
	assert.Equal([]string{costexplorer.OthersRegion}, r[2].Regions)
}
