package automation

import (
	"context"
	"strings"

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

func (s *AutomationsService) GetAutomationRunOverview(ctx context.Context, workspaceID string, subject string, runID string) (AutomationRunOverview, error) {
	run, err := s.GetAutomationRun(ctx, workspaceID, subject, runID)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	workspaceID = strings.TrimSpace(workspaceID)
	runID = strings.TrimSpace(runID)
	now := s.now()
	jobRuns, err := s.store.ListJobRuns(ctx, workspaceID, runID)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	queueJobs, err := s.store.ListJobsForRun(ctx, workspaceID, runID)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	waits, err := s.store.ListWaits(ctx, workspaceID, runID, "")
	if err != nil {
		return AutomationRunOverview{}, err
	}
	events, err := s.store.ListEvents(ctx, workspaceID, runID, 1, 100)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	logChunks, err := s.store.ListLogChunks(ctx, workspaceID, runID, "", "", 1, 100)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	artifacts, err := s.store.ListArtifacts(ctx, workspaceID, runID, "", 1, 100)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	blobSummaries, err := s.store.RunBlobSummaries(ctx, workspaceID, runID)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	runnerSessions, err := s.store.ListRunnerSessionsByLeaseOwners(ctx, workspaceID, automationRunLeaseOwners(jobRuns, queueJobs))
	if err != nil {
		return AutomationRunOverview{}, err
	}
	metrics, err := s.automationDashboardMetricsAt(ctx, workspaceID, now)
	if err != nil {
		return AutomationRunOverview{}, err
	}
	return AutomationRunOverview{
		ObservedAt:     now,
		Run:            run,
		JobRuns:        jobRuns,
		QueueJobs:      queueJobs,
		RunnerSessions: runnerSessions,
		Waits:          waits,
		Events:         events,
		LogChunks:      logChunks,
		Artifacts:      artifacts,
		BlobSummaries:  blobSummaries,
		Metrics:        metrics,
	}, nil
}

func automationRunLeaseOwners(jobRuns []automationstore.AutomationJobRun, queueJobs []automationstore.AutomationJob) []string {
	owners := make([]string, 0, len(jobRuns)+len(queueJobs))
	for _, jobRun := range jobRuns {
		if owner := strings.TrimSpace(jobRun.LeaseOwner); owner != "" {
			owners = append(owners, owner)
		}
	}
	for _, job := range queueJobs {
		if owner := strings.TrimSpace(job.LeaseOwner); owner != "" {
			owners = append(owners, owner)
		}
	}
	return owners
}
