package activity

import (
	"context"
	"strings"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/store/resource/repos"
)

// ResourceActivityRepositoryFilter narrows a batch of resource repositories
// before the read-through projector refreshes them.
type ResourceActivityRepositoryFilter func([]repos.ResourceRepository) []repos.ResourceRepository

// NormalizeResourceActivityRefreshAfter applies the service freshness default
// to absent or invalid caller values.
func NormalizeResourceActivityRefreshAfter(refreshAfter time.Duration) time.Duration {
	if refreshAfter <= 0 {
		return DefaultResourceActivityRefreshAfter
	}
	return refreshAfter
}

// RefreshVisibleResourceActivity refreshes activity for already-visible assets
// using the resource repository mapping and the configured projector. Callers
// pass the resource type they are listing and may optionally narrow the
// repository roles that should be refreshed.
func RefreshVisibleResourceActivity(ctx context.Context, projector ResourceActivityProjectorRefresher, repositoryStore *repos.Store, workspaceID, resourceType string, visible []ResourceActivityVisibleAsset, refreshAfter time.Duration, filter ResourceActivityRepositoryFilter) {
	if projector == nil || repositoryStore == nil || len(visible) == 0 {
		return
	}
	assetIDs := make([]string, 0, len(visible))
	for _, asset := range visible {
		if id := strings.TrimSpace(asset.ID); id != "" {
			assetIDs = append(assetIDs, id)
		}
	}
	if len(assetIDs) == 0 {
		return
	}
	repos, err := repositoryStore.ListForResourceBatch(ctx, workspaceID, resourceType, assetIDs)
	if err != nil {
		return
	}
	if filter == nil {
		filter = ProjectableResourceActivityRepositories
	}
	repos = filter(repos)
	if len(repos) == 0 {
		return
	}
	refreshAfter = NormalizeResourceActivityRefreshAfter(refreshAfter)
	_, _ = projector.RefreshRepositories(ctx, repos, ResourceActivityProjectorRefreshOptions{RefreshAfter: refreshAfter})
}
