package automation

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	automationstore "github.com/tidbcloud/AgentTeam/internal/store/automation"
)

func TestAutomationRunOverviewAggregatesRunDebugContext(t *testing.T) {
	ctx := context.Background()
	db, err := openServiceTestSQLiteDB(t)
	require.NoError(t, err)
	migrateAutomationServiceTestSchema(t, db, &automationstore.AutomationRunner{}, &automationstore.AutomationRunnerSession{}, &automationstore.AutomationLogChunk{}, &automationstore.AutomationArtifact{})
	store := automationstore.New(db)
	now := time.Date(2026, 6, 13, 9, 0, 0, 0, time.UTC)
	leaseUntil := now.Add(time.Minute)

	_, err = store.CreateRun(ctx, automationstore.AutomationRun{ID: "run-overview", WorkspaceID: "ws-1", Name: "Overview", Status: automationstore.AutomationRunStatusRunning, CurrentJobID: "job-build", StartedAt: &now, CreatedAt: now, UpdatedAt: now})
	require.NoError(t, err)
	require.NoError(t, store.CreateJobRuns(ctx, []automationstore.AutomationJobRun{
		{ID: "job-build", WorkspaceID: "ws-1", RunID: "run-overview", JobID: "build", JobType: "github_actions_job", Status: automationstore.AutomationJobRunStatusRunning, Attempt: 1, MaxAttempts: 3, RunsOnJSON: `["ubuntu-latest"]`, ScheduledAt: now, StartedAt: &now, LeaseOwner: "lease-1", CreatedAt: now, UpdatedAt: now},
	}))
	_, err = store.EnqueueJob(ctx, automationstore.AutomationJob{WorkspaceID: "ws-1", RunID: "run-overview", JobRunID: "job-build", QueueName: "default", Status: automationstore.AutomationJobStatusLeased, LeaseOwner: "lease-1", LeaseUntil: &leaseUntil, Attempt: 1, MaxAttempts: 3, ScheduledAt: now, IdempotencyKey: "run-overview:build", LabelsJSON: `["ubuntu-latest"]`, ShardBucket: 0, CreatedAt: now, UpdatedAt: now})
	require.NoError(t, err)
	require.NoError(t, db.Create(&automationstore.AutomationRunnerSession{WorkspaceID: "ws-1", RunnerID: "runner-1", SessionID: "session-1", LeaseOwner: "lease-1", LabelsJSON: `["ubuntu-latest"]`, Status: automationstore.AutomationRunnerSessionStatusActive, HeartbeatAt: now, ExpiresAt: now.Add(time.Minute), CreatedAt: now, UpdatedAt: now}).Error)
	require.NoError(t, db.Create(&automationstore.AutomationWait{ID: "wait-1", WorkspaceID: "ws-1", RunID: "run-overview", JobRunID: "job-build", WaitKind: automationstore.AutomationWaitKindAgentTask, Status: automationstore.AutomationWaitStatusActive, CreatedAt: now, UpdatedAt: now}).Error)
	require.NoError(t, db.Create(&automationstore.AutomationEvent{ID: "event-1", WorkspaceID: "ws-1", RunID: "run-overview", JobRunID: "job-build", EventType: "job_started", Summary: "Build started", MetadataJSON: `{}`, CreatedAt: now}).Error)
	require.NoError(t, db.Create(&automationstore.AutomationLogChunk{ID: "log-1", WorkspaceID: "ws-1", RunID: "run-overview", JobRunID: "job-build", Stream: "stdout", Sequence: 1, ObjectKey: "log", SizeBytes: 12, SHA256: "sha", ContentType: "text/plain", CreatedAt: now}).Error)
	require.NoError(t, db.Create(&automationstore.AutomationArtifact{ID: "artifact-1", WorkspaceID: "ws-1", RunID: "run-overview", JobRunID: "job-build", Name: "build.txt", ObjectKey: "artifact", SizeBytes: 34, SHA256: "sha", ContentType: "text/plain", CreatedAt: now, UpdatedAt: now}).Error)

	service := NewAutomationsService(store, func() time.Time { return now }, nil)
	overview, err := service.GetAutomationRunOverview(ctx, "ws-1", "user-1", "run-overview")
	require.NoError(t, err)
	require.Equal(t, "run-overview", overview.Run.ID)
	require.Len(t, overview.JobRuns, 1)
	require.Len(t, overview.QueueJobs, 1)
	require.Len(t, overview.RunnerSessions, 1)
	require.Len(t, overview.Waits, 1)
	require.Len(t, overview.Events, 1)
	require.Len(t, overview.LogChunks, 1)
	require.Len(t, overview.Artifacts, 1)
	require.Len(t, overview.BlobSummaries, 1)
	require.EqualValues(t, 1, overview.BlobSummaries[0].LogChunks)
	require.EqualValues(t, 12, overview.BlobSummaries[0].LogBytes)
	require.EqualValues(t, 1, overview.BlobSummaries[0].ArtifactCount)
	require.EqualValues(t, 34, overview.BlobSummaries[0].ArtifactBytes)
	require.EqualValues(t, 1, overview.Metrics.QueueMetrics.Leased)
}
