package test

import (
	"context"
	"time"

	"github.com/go-logr/logr"
	"k8s.io/apimachinery/pkg/runtime"
	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
)

// MockTIReconciler reconciles tidbinitializer object in test env
type MockTIReconciler struct {
	client.Client

	Log    logr.Logger
	Scheme *runtime.Scheme
}

func NewMockTIReconciler(mgr ctrl.Manager) *MockTIReconciler {
	return &MockTIReconciler{
		Client: mgr.GetClient(),
		Scheme: mgr.GetScheme(),
		Log:    mgr.GetLogger().WithName("MockTI"),
	}
}

func (r *MockTIReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	ti := &v1alpha1.TidbInitializer{}
	err := r.Get(ctx, req.NamespacedName, ti)
	if err != nil {
		return ctrl.Result{}, client.IgnoreNotFound(err)
	}
	return ctrl.Result{RequeueAfter: 10 * time.Second}, r.MockTidbInitializerSucceed(ctx, r.Client, ti)
}

// SetupWithManager sets up the controller with the Manager.
func (r *MockTIReconciler) SetupWithManager(mgr ctrl.Manager) error {
	return ctrl.NewControllerManagedBy(mgr).
		For(&v1alpha1.TidbInitializer{}).
		Complete(r)
}

func (r *MockTIReconciler) MockTidbInitializerSucceed(ctx context.Context, cli client.Client, ti *v1alpha1.TidbInitializer) error {
	ti.Status.Succeeded = 1
	return cli.Update(ctx, ti)
}
