package skills

import (
	"context"
	"testing"
	"time"

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

	"github.com/stretchr/testify/require"
	activitystore "github.com/tidbcloud/AgentTeam/internal/store/resource/activity"
	store "github.com/tidbcloud/AgentTeam/internal/store/resource/skills"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

func TestListSkillActivityPrefiltersVisibleSkillIDs(t *testing.T) {
	ctx := context.Background()
	db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})
	require.NoError(t, err)
	require.NoError(t, db.AutoMigrate(&store.Skill{}, &store.SkillVersion{}, &store.SkillGrant{}, &activitystore.ResourceActivityEvent{}, &activitystore.ResourceActivityLatestCommit{}))
	skillStore := store.New(db)
	activityStore := activitystore.New(db)
	svc := &Service{store: skillStore, activityStore: activityStore}
	now := time.Date(2026, 6, 22, 10, 0, 0, 0, time.UTC)
	deletedAt := now
	require.NoError(t, db.Create(&store.Skill{ID: "skill_visible", WorkspaceID: "ws_1", Slug: "visible", Name: "Visible", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now}).Error)
	require.NoError(t, db.Create(&store.SkillGrant{ID: "grant_visible", WorkspaceID: "ws_1", SkillID: "skill_visible", SubjectType: "user", SubjectID: "viewer", Role: "view", CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now}).Error)
	require.NoError(t, db.Create(&store.Skill{ID: "skill_deleted", WorkspaceID: "ws_1", Slug: "deleted", Name: "Deleted", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now, DeletedAt: &deletedAt}).Error)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_missing", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeSkill, AssetID: "skill_missing", EventType: "issue_opened", OccurredAt: now.Add(2 * time.Minute)})
	require.NoError(t, err)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_deleted", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeSkill, AssetID: "skill_deleted", EventType: "issue_opened", OccurredAt: now.Add(time.Minute)})
	require.NoError(t, err)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_visible", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeSkill, AssetID: "skill_visible", EventType: "issue_opened", OccurredAt: now})
	require.NoError(t, err)

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

func TestListSkillActivityIncludesActorTombstoneEvents(t *testing.T) {
	ctx := context.Background()
	db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})
	require.NoError(t, err)
	require.NoError(t, db.AutoMigrate(&store.Skill{}, &store.SkillVersion{}, &store.SkillGrant{}, &activitystore.ResourceActivityEvent{}, &activitystore.ResourceActivityLatestCommit{}))
	activityStore := activitystore.New(db)
	svc := &Service{store: store.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.AssetTypeSkill, AssetID: "skill_deleted", EventType: "deleted", ActorID: "viewer", DetailsJSON: `{"name":"Removed skill"}`, OccurredAt: now.Add(time.Minute)})
	require.NoError(t, err)
	_, err = activityStore.UpsertEvent(ctx, activitystore.ResourceActivityEvent{ID: "act_other_deleted", WorkspaceID: "ws_1", AssetType: activitystore.AssetTypeSkill, AssetID: "skill_other", EventType: "deleted", ActorID: "other", DetailsJSON: `{"name":"Other skill"}`, OccurredAt: now})
	require.NoError(t, err)

	page, err := svc.ListSkillActivity(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 skill", page.Items[0].AssetName)
}
