package automation

import (
	"errors"
	"fmt"
	"strings"

	"gorm.io/gorm"
)

// Store owns automation-domain persistence.
type Store struct{ db *gorm.DB }

const (
	automationClaimMaxRunnerLabels = 8
	// AutomationClaimShardCount is the fixed queue shard count for automation job claims.
	AutomationClaimShardCount = 16
)

var ErrActiveRunCapacity = errors.New("automation active run limit reached")

func New(db *gorm.DB) *Store               { return &Store{db: db} }
func (s *Store) WithDB(db *gorm.DB) *Store { return &Store{db: db} }

func (s *Store) ensureDB() error {
	if s == nil || s.db == nil {
		return fmt.Errorf("automations store db is nil")
	}
	return nil
}

func applyWorkspaceScope(query *gorm.DB, column string, scopes [][]string) *gorm.DB {
	if len(scopes) == 0 {
		return query
	}
	if scopes[0] == nil {
		return query
	}
	workspaceIDs := make([]string, 0, len(scopes[0]))
	seen := make(map[string]struct{}, len(scopes[0]))
	for _, workspaceID := range scopes[0] {
		workspaceID = strings.TrimSpace(workspaceID)
		if workspaceID == "" {
			continue
		}
		if _, ok := seen[workspaceID]; ok {
			continue
		}
		seen[workspaceID] = struct{}{}
		workspaceIDs = append(workspaceIDs, workspaceID)
	}
	if len(workspaceIDs) == 0 {
		return query.Where("1 = 0")
	}
	return query.Where(column+" IN ?", workspaceIDs)
}
