package manager

import (
	"context"
	"fmt"

	"k8s.io/client-go/rest"
	"sigs.k8s.io/controller-runtime/pkg/manager"
)

type Manager interface {
	manager.Manager
}

type Options struct {
	Manager manager.Options
}

type ControllerManager struct {
	manager.Manager
}

func New(cfg *rest.Config, opts Options) (Manager, error) {
	m, err := manager.New(cfg, opts.Manager)
	if err != nil {
		return nil, fmt.Errorf("can't create manager: %w", err)
	}
	return &ControllerManager{Manager: m}, nil
}

func (m *ControllerManager) Start(ctx context.Context) error {
	if err := m.Manager.Start(ctx); err != nil {
		return fmt.Errorf("can't start manager: %w", err)
	}
	return nil
}

var _ manager.LeaderElectionRunnable = noNeedLeaderElection{}

type noNeedLeaderElection struct {
	manager.Runnable
}

func (noNeedLeaderElection) NeedLeaderElection() bool { return false }

func RunAnyWhere(r manager.Runnable) manager.Runnable {
	return noNeedLeaderElection{r}
}
