package app

import (
	"context"
	"fmt"
	"strings"

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

func (store *Store) AgentRuntimeSnapshotsForWorkspace(ctx context.Context, userID string, workspaceID string, agentIDs []string) ([]agent.AgentRuntimeSnapshot, error) {
	normalizedAgentIDs := normalizeNonEmptyStrings(agentIDs)
	if len(normalizedAgentIDs) == 0 {
		return []agent.AgentRuntimeSnapshot{}, nil
	}
	if len(normalizedAgentIDs) > agent.MaxAgentRuntimeSnapshotIDs {
		return nil, badRequest("too many agentIds")
	}
	if _, err := store.loadRuntimeWorkspaceMember(ctx, store.db, userID, workspaceID); err != nil {
		return nil, err
	}

	requestedAgentsCTE, requestedAgentArgs, _, err := coredb.BuildIndexedStringValuesCTE("requested_agents", "agent_id", "request_order", normalizedAgentIDs, 3)
	if err != nil {
		return nil, err
	}
	args := append([]any{strings.TrimSpace(workspaceID), strings.TrimSpace(userID)}, requestedAgentArgs...)
	rows, err := store.db.Query(ctx, `
WITH `+requestedAgentsCTE+`
SELECT
    a.id,
    a.machine_id,
    mac.created_by_user_id = $2 AS can_manage,
    'offline' AS machine_status,
    a.auto_wake_enabled,
    'inactive' AS status,
    'offline' AS activity,
    '' AS activity_detail
FROM requested_agents requested
JOIN agents a ON a.workspace_id = $1 AND a.id = requested.agent_id
JOIN machines mac ON mac.workspace_id = a.workspace_id AND mac.id = a.machine_id
WHERE a.status <> 'archived'
  AND mac.status = 'active'
ORDER BY requested.request_order ASC
`, args...)
	if err != nil {
		return nil, fmt.Errorf("list agent runtime snapshots: %w", err)
	}
	defer rows.Close()

	snapshots := make([]agent.AgentRuntimeSnapshot, 0, len(normalizedAgentIDs))
	for rows.Next() {
		var snapshot agent.AgentRuntimeSnapshot
		if err := rows.Scan(
			&snapshot.AgentID,
			&snapshot.MachineID,
			&snapshot.CanManage,
			&snapshot.MachineStatus,
			&snapshot.AutoWakeEnabled,
			&snapshot.Status,
			&snapshot.Activity,
			&snapshot.ActivityDetail,
		); err != nil {
			return nil, fmt.Errorf("scan agent runtime snapshot: %w", err)
		}
		snapshots = append(snapshots, snapshot)
	}
	if err := rows.Err(); err != nil {
		return nil, fmt.Errorf("iterate agent runtime snapshots: %w", err)
	}
	return snapshots, nil
}
