package tests

import (
	"testing"

	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/handler/paymenthandler"
	"github.com/pingcap/dbaas/billing2/model/billing"
	"github.com/pingcap/dbaas/billing2/model/migrate"
	"github.com/pingcap/dbaas/billing2/utils/tests"
	"github.com/stretchr/testify/suite"
)

type MigrateTestSuite struct {
	tests.BillingTestSuite
}

func TestPackageSuite(t *testing.T) {
	suite.Run(t, new(MigrateTestSuite))
}
func (suite *MigrateTestSuite) TestCreateNewPackages() {
	assert := suite.Assert()
	migrateModel := &migrate.MigrateModel{}
	assert.NoError(migrateModel.CreateNewPackages())
	packages, err := (&billing.PackageModel{}).GetAllPackages()
	assert.NoError(err)
	assert.Len(packages, 3)
	assert.Equal(packages[0].Description, "POC Package")
	assert.Equal(packages[1].Description, "OnDemand Package")
	assert.Equal(packages[2].Description, "DevTier Package")
}

type MockCentralHandlerImpl struct{}

func (*MockCentralHandlerImpl) GetTenant(tenantID uint) (*forms.Tenant, error) {
	return &forms.Tenant{
		TenantID: tenantID,
	}, nil
}

func (*MockCentralHandlerImpl) GetAllTenants() ([]forms.Tenant, error) {
	return []forms.Tenant{
		{
			TenantID:                  1,
			ThirdPartyAccountProvider: "",
			ThirdPartyAccountCode:     "",
		},
		{
			TenantID:                  2,
			ThirdPartyAccountProvider: paymenthandler.AwsAccountProvider,
			ThirdPartyAccountCode:     "mock_user_code",
		},
		{
			TenantID:                  3,
			ThirdPartyAccountProvider: "",
			ThirdPartyAccountCode:     "",
			Plan:                      "on_demand",
		},
	}, nil
}

func (suite *MigrateTestSuite) TestUpdateDataTransferCategory() {
	assert := suite.Assert()
	migrateModel := &migrate.MigrateModel{}

	assert.NoError(migrateModel.CreateSystemSKU())
	assert.NoError(migrateModel.UpdateDataTransferCategory())
	unitModel := &billing.UnitModel{}
	info, err := unitModel.GetUnit("network-traffic:all")
	assert.NoError(err)
	assert.Equal(info.Category, "Data Transfer Cost - Load Balancing")
}

func (suite *MigrateTestSuite) TestCreateNetworkDetailSKU() {
	assert := suite.Assert()
	migrateModel := &migrate.MigrateModel{}

	assert.NoError(migrateModel.CreateNetworkDetailSKU())
	unitModel := &billing.UnitModel{}
	info, err := unitModel.GetUnit("network-traffic:aws:lb")
	assert.NoError(err)
	assert.Equal(info.Category, "Data Transfer Cost - AWS Load Balancing")
}
