package server

import (
	"context"

	"github.com/tidbcloud/cluster-service-ng/domain/entity"
	"github.com/tidbcloud/cluster-service-ng/pkg/storage/repo"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

func (s *serverImpl) ListTiDBClusters(ctx context.Context, sharedPoolId, tenantId string) ([]*entity.TiDBCluster, error) {
	tenantIds := make([]string, 0)
	sharedPoolIds := make([]string, 0)

	if tenantId != "" {
		tenantIds = append(tenantIds, tenantId)
	}

	if sharedPoolId != "" {
		sharedPoolIds = append(sharedPoolIds, sharedPoolId)
	}

	if len(sharedPoolIds) == 0 && len(tenantIds) == 0 {
		return nil, status.Errorf(codes.InvalidArgument, "at least one of sharedPoolId or tenantId must be specified")
	}

	tidbClusters, err := s.tidbClusterRepo.List(ctx, &repo.TiDBClusterListFilter{
		SharedPoolIds: sharedPoolIds,
		TenantIds:     tenantIds,
		Deleted:       false,
	})

	if err != nil {
		return nil, status.Errorf(codes.Internal, "failed to list tidb clusters: %s", err)
	}

	for _, tc := range tidbClusters {
		err = s.setTiDBClusterStatus(ctx, tc)
		if err != nil {
			return nil, status.Errorf(codes.Internal, "failed to get tidbCluster status: %s", err)
		}
	}

	return tidbClusters, nil
}
