package owner

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

// GroupMembershipChecker checks whether a workspace currently routes to a group.
type GroupMembershipChecker interface {
	IsWorkspaceRoutableToGroup(ctx context.Context, workspaceID string, workspaceGroupID string) (bool, error)
}

// NewGroupSet returns a DB-backed owner set for one workspace group.
func NewGroupSet(checker GroupMembershipChecker, workspaceGroupID string) (ManagedWorkspaceSet, error) {
	trimmedGroupID := strings.TrimSpace(workspaceGroupID)
	if trimmedGroupID == "" {
		return nil, fmt.Errorf("workspace group id is required")
	}
	if checker == nil {
		return nil, fmt.Errorf("workspace placement checker is not configured")
	}
	return groupSet{checker: checker, workspaceGroupID: trimmedGroupID}, nil
}

type groupSet struct {
	checker          GroupMembershipChecker
	workspaceGroupID string
}

func (set groupSet) Has(workspaceID string) bool {
	trimmedWorkspaceID := strings.TrimSpace(workspaceID)
	if trimmedWorkspaceID == "" {
		return false
	}
	owned, err := set.checker.IsWorkspaceRoutableToGroup(context.Background(), trimmedWorkspaceID, set.workspaceGroupID)
	return err == nil && owned
}
