package accountdb

import (
	"context"

	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/dataflow-service/internal/grpc/grpcli"
	"github.com/tidbcloud/dataflow-service/pkg/account/accounttypes"
)

type ProjectWrapper interface {
	ListProjectMapByIDs(ctx context.Context, projectIDs []uint64) (map[uint64]accounttypes.Project, error)
}

func NewProjectWrapper() ProjectWrapper {
	return &ProjectWrapperImpl{}
}

type ProjectWrapperImpl struct{}

func (w *ProjectWrapperImpl) ListProjectMapByIDs(
	ctx context.Context, projectIDs []uint64,
) (map[uint64]accounttypes.Project, error) {
	return ListProjectMapByIDs(ctx, projectIDs)
}

func ListProjectMapByIDs(ctx context.Context, projectIDs []uint64) (map[uint64]accounttypes.Project, error) {
	if len(projectIDs) == 0 {
		return nil, nil
	}
	request := &account.ProjectFilter{
		Ids:    projectIDs,
		Status: []string{string(accounttypes.ProjectStatusActive)},
	}

	response, err := grpcli.ListProjects(ctx, request)
	if err != nil {
		return nil, err
	}

	result := make(map[uint64]accounttypes.Project, len(response.Projects))
	for _, project := range response.Projects {
		result[project.Id] = *convertProject(project)
	}

	return result, nil
}
