package account

import (
	httptransport "github.com/go-openapi/runtime/client"
	"github.com/go-openapi/strfmt"
	"github.com/samber/lo"
	"github.com/stretchr/testify/require"
	"github.com/stretchr/testify/suite"

	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/account/client"
	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/account/client/tenant_service"
	"github.com/tidbcloud/tidb-management-service/functional-test/pkg/account/client/user_service"
)

type Cli struct {
	*client.GRPCForOurDBaaSCentralService

	su *suite.Suite
}

func NewClient(su *suite.Suite, host, bearerToken string) (*Cli, error) {
	trans := httptransport.New(host, "", []string{"https"})
	trans.DefaultAuthentication = httptransport.BearerToken(bearerToken)
	return &Cli{su: su, GRPCForOurDBaaSCentralService: client.New(trans, strfmt.Default)}, nil
}

func (cli *Cli) CreateSqlUser(orgId, projectId, clusterId, userName, password string) {
	params := user_service.NewCreateSQLUserParams()
	params.OrgID = orgId
	params.ProjectID = projectId
	params.ClusterID = clusterId
	params.Body = user_service.CreateSQLUserBody{
		UserName:    lo.ToPtr(userName),
		Password:    lo.ToPtr(password),
		AuthMethod:  "mysql_native_password",
		BuiltinRole: lo.ToPtr("role_admin"),
	}

	_, err := cli.UserService.CreateSQLUser(params, nil)
	require.NoError(cli.su.T(), err)
}

func (cli *Cli) DeleteSqlUser(orgId, projectId, clusterId, userName string) {
	params := user_service.NewDeleteSQLUserParams()
	params.OrgID = orgId
	params.ProjectID = projectId
	params.ClusterID = clusterId
	params.Body = user_service.DeleteSQLUserBody{
		UserName: lo.ToPtr(userName),
	}

	_, err := cli.UserService.DeleteSQLUser(params, nil)
	require.NoError(cli.su.T(), err)
}

func (cli *Cli) DeleteProject(orgId, projectId string) {
	params := tenant_service.NewDeleteProjectParams()
	params.OrgID = orgId
	params.ProjectID = projectId

	_, err := cli.TenantService.DeleteProject(params, nil)
	require.NoError(cli.su.T(), err)
}
