package message

import (
	"context"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

func resolveAutomationRunSources(ctx context.Context, queryer coredb.Queryer, workspaceID string, messageIDs []string) (map[string]ContributionSource, error) {
	messageIDs = normalizeContributionSourceMessageIDs(messageIDs)
	if queryer == nil || strings.TrimSpace(workspaceID) == "" || len(messageIDs) == 0 {
		return map[string]ContributionSource{}, nil
	}
	cte, cteArgs, _, err := coredb.BuildStringValuesCTE("requested_messages", "message_id", messageIDs, 2)
	if err != nil {
		return nil, err
	}
	args := append([]any{workspaceID}, cteArgs...)
	rows, err := queryer.Query(ctx, fmt.Sprintf(`
WITH %s
SELECT
  requested_messages.message_id,
  run.id,
  run.automation_id,
  run.automation_name_snapshot,
  run.source_type,
  run.source_occurrence_ref
FROM requested_messages
JOIN automation_runs run
  ON run.workspace_id = $1
 AND run.message_id = requested_messages.message_id
 AND run.automation_kind = 'schedule'
ORDER BY run.completed_at DESC, run.attempted_at DESC, run.id DESC
`, cte), args...)
	if err != nil {
		return nil, fmt.Errorf("load automation run contribution sources: %w", err)
	}
	defer rows.Close()
	byMessageID := make(map[string]ContributionSource)
	for rows.Next() {
		var messageID string
		var runID string
		var automationID string
		var automationName string
		var sourceType string
		var sourceOccurrenceRef string
		if err := rows.Scan(
			&messageID,
			&runID,
			&automationID,
			&automationName,
			&sourceType,
			&sourceOccurrenceRef,
		); err != nil {
			return nil, fmt.Errorf("scan automation run contribution source: %w", err)
		}
		messageID = strings.TrimSpace(messageID)
		if messageID == "" {
			continue
		}
		if _, exists := byMessageID[messageID]; exists {
			continue
		}
		byMessageID[messageID] = ContributionSourceForAutomationRun(AutomationRunContributionSourceParams{
			RunID:               runID,
			AutomationID:        automationID,
			AutomationName:      automationName,
			SourceType:          sourceType,
			SourceOccurrenceRef: sourceOccurrenceRef,
		})
	}
	if err := rows.Err(); err != nil {
		return nil, fmt.Errorf("iterate automation run contribution sources: %w", err)
	}
	return byMessageID, nil
}
