package runtime

import (
	"context"
	"github.com/tidbcloud/AgentTeam/internal/observability/logging"
)

// Close releases resources owned by the configured executor.
func (r *ServerRunner) Close() error {
	if r == nil || r.executor == nil {
		return nil
	}
	r.closeOnce.Do(func() {
		closer, ok := r.executor.(interface{ Close() error })
		if ok {
			r.closeErr = closer.Close()
		}
	})
	return r.closeErr
}

// Quiesce stops new claims and waits for already claimed jobs to finish.
func (r *ServerRunner) Quiesce(ctx context.Context) error {
	if r == nil {
		return nil
	}
	r.claimMu.Lock()
	r.claiming = false
	r.claimMu.Unlock()
	done := make(chan struct{})
	logging.Go(nil, func() {
		r.inFlight.Wait()
		close(done)
	})
	select {
	case <-done:
		return nil
	case <-ctx.Done():
		return ctx.Err()
	}
}
