package account

import (
	"context"

	accountsdk "github.com/tidbcloud/account/idl/pbgen/proto/account"

	openapicommonv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

//go:generate go run go.uber.org/mock/mockgen@latest -source=$GOFILE -package=mock_$GOPACKAGE -destination=./mock_$GOPACKAGE/mock_$GOFILE
type Client interface {
	GetTenantThirdPartyAccountProviders(
		ctx context.Context,
		id uint64,
	) ([]openapicommonv1beta1.Region_CloudProvider, error)
	GetUserById(ctx context.Context, userId uint64) (*accountsdk.User, error)
	GetUserByEmail(ctx context.Context, email string) (*accountsdk.User, error)
	IsUserInOrg(ctx context.Context, email string, orgId uint64) (bool, error)
	GetProject(ctx context.Context, projectId uint64) (*accountsdk.Project, error)
	GetTimeZoneByProjectID(ctx context.Context, projectId uint64) (int32, error)
	SendEmail(ctx context.Context, req *accountsdk.SendEmailReq) (*accountsdk.SendEmailResp, bizerr.BizError)
	ListProjectOwnerUsers(ctx context.Context, projectId uint64) ([]*accountsdk.User, bizerr.BizError)
	ListOrgOwnerUsers(ctx context.Context, orgId uint64) ([]*accountsdk.User, bizerr.BizError)
	ClearEmailUniqueID(
		ctx context.Context,
		req *accountsdk.ClearEmailUniqueIDReq,
	) (*accountsdk.ClearEmailUniqueIDResp, bizerr.BizError)
	IsHitFeatureFlag(ctx context.Context, req *accountsdk.HitFeatureFlagReq) (bool, error)
	ListHitFeatureFlagNames(ctx context.Context, req *accountsdk.ListHitFeatureFlagNamesReq) ([]string, error)
	GetOpenAPIAccess(ctx context.Context, publicKey string) (*accountsdk.GetOpenAPIAccessResp, bizerr.BizError)
	GetOrCreateSystemUser(ctx context.Context, orgID uint64) (*accountsdk.User, bizerr.BizError)
	GetOrgByID(ctx context.Context, orgId uint64) (*accountsdk.Org, error)

	AddClusterRelations(ctx context.Context, orgId, clusterId uint64) error
	DeleteClusterRelations(ctx context.Context, clusterId uint64) error
	UpsertClusterRelations(ctx context.Context, clusterId, targetOrgId, targetProjectId uint64) error
	CheckOperatorHasClusterRole(ctx context.Context, orgId uint64, clusterIds []uint64) (map[uint64]bool, error)

	GetInstancePermissionScopeOfUser(ctx context.Context, orgId uint64, userId string) (bool, []uint64, []uint64, error)
	CheckBackupMutationPermission(ctx context.Context, orgId, projectId, clusterId uint64, userId string) (bool, error)

	CopyXProject(ctx context.Context, orgID uint64, name string, sourceProjectId uint64) (uint64, error)

	// GetTidbxVirtualProjectId returns the project_id of the virtual project
	// (PROJECT_TYPE_TIDBXVIRTUAL) under the given organization. This project
	// is used as the default project for Premium and BYOC clusters when no
	// explicit project_id is supplied during cluster creation.
	GetTidbxVirtualProjectId(ctx context.Context, orgId uint64) (uint64, error)
}
