package accountcli

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"
)

// Deprecated: For newly-written tests, use mock in tests instead. Do not add mock data here.
type fakeImpl struct{}

func (f *fakeImpl) GetTidbxVirtualProjectId(ctx context.Context, orgId uint64) (uint64, error) {
	return 0, nil
}

func (f *fakeImpl) CopyXProject(ctx context.Context, orgID uint64, name string, sourceProjectId uint64) (uint64, error) {
	return 0, nil
}

func (f *fakeImpl) AddClusterRelations(ctx context.Context, orgId, clusterId uint64) error {
	return nil
}

func (f *fakeImpl) DeleteClusterRelations(ctx context.Context, clusterId uint64) error {
	return nil
}

func (f *fakeImpl) UpsertClusterRelations(_ context.Context, _, _, _ uint64) error {
	return nil
}

func (f *fakeImpl) GetTenantThirdPartyAccountProviders(
	ctx context.Context,
	id uint64,
) ([]openapicommonv1beta1.Region_CloudProvider, error) {
	return []openapicommonv1beta1.Region_CloudProvider{}, nil
}

func (f *fakeImpl) GetProject(ctx context.Context, projectId uint64) (*accountsdk.Project, error) {
	return &accountsdk.Project{}, nil
}

func (f *fakeImpl) GetUserById(ctx context.Context, userId uint64) (*accountsdk.User, error) {
	return &accountsdk.User{Id: userId, Email: "test@pingcap.com"}, nil
}

func (f *fakeImpl) GetUserByEmail(ctx context.Context, email string) (*accountsdk.User, error) {
	return &accountsdk.User{Id: 10, Email: email}, nil
}

func (f *fakeImpl) IsUserInOrg(ctx context.Context, email string, orgId uint64) (bool, error) {
	return true, nil
}

func (f *fakeImpl) GetTimeZoneByProjectID(ctx context.Context, projectId uint64) (int32, error) {
	return 8, nil
}

func (f *fakeImpl) SendEmail(
	ctx context.Context,
	req *accountsdk.SendEmailReq,
) (*accountsdk.SendEmailResp, bizerr.BizError) {
	return &accountsdk.SendEmailResp{}, nil
}

func (f *fakeImpl) ListProjectOwnerUsers(ctx context.Context, projectId uint64) ([]*accountsdk.User, bizerr.BizError) {
	return []*accountsdk.User{{Id: 1}}, nil
}

func (f *fakeImpl) ListOrgOwnerUsers(ctx context.Context, orgId uint64) ([]*accountsdk.User, bizerr.BizError) {
	return []*accountsdk.User{{Id: 1}}, nil
}

func (f *fakeImpl) ClearEmailUniqueID(
	ctx context.Context,
	req *accountsdk.ClearEmailUniqueIDReq,
) (*accountsdk.ClearEmailUniqueIDResp, bizerr.BizError) {
	return &accountsdk.ClearEmailUniqueIDResp{}, nil
}

func (f *fakeImpl) IsHitFeatureFlag(ctx context.Context, req *accountsdk.HitFeatureFlagReq) (bool, error) {
	return false, nil
}

func (f *fakeImpl) ListHitFeatureFlagNames(ctx context.Context, req *accountsdk.ListHitFeatureFlagNamesReq) ([]string, error) {
	return nil, nil
}

func (f *fakeImpl) GetOpenAPIAccess(
	ctx context.Context,
	publicKey string,
) (*accountsdk.GetOpenAPIAccessResp, bizerr.BizError) {
	return &accountsdk.GetOpenAPIAccessResp{}, nil
}

func (f *fakeImpl) GetOrCreateSystemUser(ctx context.Context, orgID uint64) (*accountsdk.User, bizerr.BizError) {
	return &accountsdk.User{Id: 1}, nil
}

func (f *fakeImpl) GetOrgByID(ctx context.Context, orgID uint64) (*accountsdk.Org, error) {
	return &accountsdk.Org{Id: 1}, nil
}

func (f *fakeImpl) CheckOperatorHasClusterRole(ctx context.Context, orgId uint64, clusterIds []uint64) (map[uint64]bool, error) {
	return map[uint64]bool{}, nil
}

func (f *fakeImpl) GetInstancePermissionScopeOfUser(
	ctx context.Context,
	orgId uint64, userId string,
) (all bool, projectIds, instanceIds []uint64, err error) {
	return false, nil, nil, nil
}

func (f *fakeImpl) CheckBackupMutationPermission(
	ctx context.Context,
	orgId, projectId, clusterId uint64,
	userId string,
) (bool, error) {
	return false, nil
}
