package controller_manager //nolint:revive

import (
	"context"
	"fmt"

	k8simpl "github.com/pingcap/test-infra/sdk/resource/impl/k8s"
	"github.com/pingcap/test-infra/services/rms/config"
	"github.com/pingcap/test-infra/services/rms/service/provider"
	"github.com/pingcap/test-infra/services/rms/service/provider/k8s"
)

type DefaultManager struct {
	tidbCloudController *k8simpl.TiDBCloudObjectController
	k8sProvider         provider.Interface
}

func NewDefaultManager() *DefaultManager {
	var m *DefaultManager
	switch config.DefaultRMSConfiguration.Provider {
	case "k8s":
		k8sProvider, err := k8s.NewDefaultProvider(config.DefaultRMSConfiguration.K8s.SDKKubeConfig)
		if err != nil {
			panic(fmt.Errorf("new manager error: %s", err))
		}

		controller, err := k8simpl.NewTiDBCloudClusterController(k8sProvider.ClientSet, k8sProvider.TiDBCloud, config.DefaultRMSConfiguration.TiDBCloudConfiguration)
		if err != nil {
			panic(fmt.Errorf("new tidbcloud controller error: %s", err))
		}

		m = &DefaultManager{k8sProvider: k8sProvider, tidbCloudController: controller}
	default:
		panic(fmt.Errorf("unknown provider: %s", config.DefaultRMSConfiguration.Provider))
	}
	return m
}

func (m *DefaultManager) Start(context context.Context) error {
	// TODO: uses leaderelection
	return m.tidbCloudController.StartUntil(context, 1)
}
