package automation

import (
	"context"
	"fmt"
	"strings"
	"time"
)

func (s *Store) ListActiveRunners(ctx context.Context, workspaceID string) ([]AutomationRunner, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	var runners []AutomationRunner
	if err := s.db.WithContext(ctx).
		Where("workspace_id = ? AND status = ? AND revoked_at IS NULL", strings.TrimSpace(workspaceID), AutomationRunnerStatusActive).
		Order("runner_id ASC").
		Find(&runners).Error; err != nil {
		return nil, fmt.Errorf("list active automation runners: %w", err)
	}
	return runners, nil
}

func (s *Store) ListActiveRunnerSessions(ctx context.Context, workspaceID string, now time.Time) ([]AutomationRunnerSession, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	var sessions []AutomationRunnerSession
	if err := s.db.WithContext(ctx).
		Where("workspace_id = ? AND status = ? AND revoked_at IS NULL AND expires_at > ?", strings.TrimSpace(workspaceID), AutomationRunnerSessionStatusActive, now).
		Order("runner_id ASC").
		Order("updated_at DESC").
		Find(&sessions).Error; err != nil {
		return nil, fmt.Errorf("list active automation runner sessions: %w", err)
	}
	return sessions, nil
}

func (s *Store) ListQueueJobsByStatuses(ctx context.Context, workspaceID string, statuses ...string) ([]AutomationJob, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	trimmedStatuses := make([]string, 0, len(statuses))
	for _, status := range statuses {
		if value := strings.TrimSpace(status); value != "" {
			trimmedStatuses = append(trimmedStatuses, value)
		}
	}
	if len(trimmedStatuses) == 0 {
		return []AutomationJob{}, nil
	}
	var jobs []AutomationJob
	if err := s.db.WithContext(ctx).
		Where("workspace_id = ? AND status IN ?", strings.TrimSpace(workspaceID), trimmedStatuses).
		Order("id ASC").
		Find(&jobs).Error; err != nil {
		return nil, fmt.Errorf("list automation jobs by status: %w", err)
	}
	return jobs, nil
}
