package memory

import (
	"context"
	"testing"
	"time"

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

	"github.com/stretchr/testify/require"
	activitystore "github.com/tidbcloud/AgentTeam/internal/store/resource/activity"
	memorystore "github.com/tidbcloud/AgentTeam/internal/store/resource/memory"
)

func TestListMemoryActivityPrefiltersVisibleMemoryIDs(t *testing.T) {
	ctx := context.Background()
	db, err := gormtest.OpenSQLiteDB(t)
	require.NoError(t, err)
	require.NoError(t, db.AutoMigrate(&memorystore.Memory{}, &memorystore.MemoryContentCheckpoint{}, &memorystore.MemoryGrant{}, &activitystore.ResourceActivityEvent{}, &activitystore.ResourceActivityLatestCommit{}))
	memStore := memorystore.New(db)
	activityStore := activitystore.New(db)
	svc := &MemoryService{store: memStore, activityStore: activityStore}
	now := time.Date(2026, 6, 22, 10, 0, 0, 0, time.UTC)
	require.NoError(t, db.Create(&memorystore.Memory{ID: "mem_allowed", Name: "Allowed", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now}).Error)
	require.NoError(t, db.Create(&memorystore.Memory{ID: "mem_private", Name: "Private", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now}).Error)
	require.NoError(t, db.Create(&memorystore.MemoryGrant{ID: "grant_1", WorkspaceID: "ws_1", MemoryID: "mem_allowed", SubjectType: "user", SubjectID: "viewer", Role: "view", CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now}).Error)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_private", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeMemory, AssetID: "mem_private", EventType: "updated", OccurredAt: now.Add(time.Minute)})
	require.NoError(t, err)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_allowed", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeMemory, AssetID: "mem_allowed", EventType: "updated", OccurredAt: now})
	require.NoError(t, err)

	page, err := svc.ListMemoryActivity(ctx, "ws_1", "viewer", activity.ResourceActivityListOptions{Limit: 10})
	require.NoError(t, err)
	require.Len(t, page.Items, 1)
	require.Equal(t, "act_allowed", page.Items[0].ID)
	require.Equal(t, "Allowed", page.Items[0].AssetName)
}

func TestListMemoryActivityIncludesActorTombstoneEvents(t *testing.T) {
	ctx := context.Background()
	db, err := gormtest.OpenSQLiteDB(t)
	require.NoError(t, err)
	require.NoError(t, db.AutoMigrate(&memorystore.Memory{}, &memorystore.MemoryContentCheckpoint{}, &memorystore.MemoryGrant{}, &activitystore.ResourceActivityEvent{}, &activitystore.ResourceActivityLatestCommit{}))
	activityStore := activitystore.New(db)
	svc := &MemoryService{store: memorystore.New(db), activityStore: activityStore}
	now := time.Date(2026, 6, 22, 10, 0, 0, 0, time.UTC)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_actor_deleted", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeMemory, AssetID: "mem_deleted", EventType: "deleted", ActorID: "viewer", DetailsJSON: `{"name":"Removed memory"}`, OccurredAt: now.Add(time.Minute)})
	require.NoError(t, err)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_other_deleted", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeMemory, AssetID: "mem_other", EventType: "deleted", ActorID: "other", DetailsJSON: `{"name":"Other memory"}`, OccurredAt: now})
	require.NoError(t, err)

	page, err := svc.ListMemoryActivity(ctx, "ws_1", "viewer", activity.ResourceActivityListOptions{Limit: 10})

	require.NoError(t, err)
	require.Len(t, page.Items, 1)
	require.Equal(t, "act_actor_deleted", page.Items[0].ID)
	require.Equal(t, "Removed memory", page.Items[0].AssetName)
}
