package memory

import (
	"context"

	activityservice "github.com/tidbcloud/AgentTeam/internal/service/resource/activity"

	activitystore "github.com/tidbcloud/AgentTeam/internal/store/resource/activity"
	memorystore "github.com/tidbcloud/AgentTeam/internal/store/resource/memory"
	"github.com/tidbcloud/AgentTeam/internal/store/resource/repos"
)

func (s *MemoryService) ListMemoryActivity(ctx context.Context, workspaceID, subject string, opts activityservice.ResourceActivityListOptions) (activityservice.ResourceActivityPage, error) {
	if s == nil || s.store == nil {
		return activityservice.ResourceActivityPage{}, invalidArgument("memory service is not configured")
	}
	if s.activityStore == nil {
		return activityservice.ResourceActivityPage{}, invalidArgument("activity store is not configured")
	}
	if err := validateSubject(subject); err != nil {
		return activityservice.ResourceActivityPage{}, err
	}
	visible, err := s.store.ListVisibleMemories(ctx, workspaceID, subject, true)
	if err != nil {
		return activityservice.ResourceActivityPage{}, err
	}
	visibleAssets := memoryActivityVisibleAssets(visible)
	activityservice.RefreshVisibleResourceActivity(ctx, s.activityProjector, s.repositoryStore, workspaceID, repos.ResourceTypeMemory, visibleAssets, s.activityRefreshAfter, nil)
	return activityservice.ListResourceActivity(ctx, s.activityStore, workspaceID, activityservice.ResourceActivityDescriptor{
		AssetType:        activitystore.AssetTypeMemory,
		VisibleAssets:    visibleAssets,
		TombstoneActorID: subject,
		TombstoneEventTypes: []string{
			memoryActivityArchived,
			memoryActivityDeleted,
		},
	}, opts)
}

func memoryActivityVisibleAssets(memories []memorystore.Memory) []activityservice.ResourceActivityVisibleAsset {
	visibleAssets := make([]activityservice.ResourceActivityVisibleAsset, 0, len(memories))
	for _, memory := range memories {
		visibleAssets = append(visibleAssets, activityservice.ResourceActivityVisibleAsset{
			ID:   memory.ID,
			Name: memory.Name,
		})
	}
	return visibleAssets
}
