package tidbmanager

import (
	"context"
	"strings"
	"time"

	"github.com/go-logr/logr"
	"github.com/tidbcloud/aws-shared-provider/pkg/metrics"
	"github.com/tidbcloud/aws-shared-provider/pkg/utils"
	"github.com/tidbcloud/aws-shared-provider/pkg/utils/tidb"
)

const (
	activateTimeout = 300 * time.Second
)

func newActivator(
	logger logr.Logger,
	tidbPoolNamespace string,
	tidbController tidb.Controller,
) activator {
	return &activate{
		Logger:            logger.WithName("activate.do"),
		Controller:        tidbController,
		tidbPoolNamespace: tidbPoolNamespace,
	}
}

// activator know how to activate tidb.
type activator interface {
	do(ctx context.Context, host, token, podName string, param *tidb.ActivateParameter) error
}

type activate struct {
	logr.Logger
	tidb.Controller
	tidbPoolNamespace string
}

func (a *activate) do(ctx context.Context, host, token, podName string, param *tidb.ActivateParameter) (err error) {
	rlt := "success"
	start := time.Now()
	defer func() {
		d := time.Since(start)
		if err != nil {
			rlt = "fail"
			a.Error(err, "activate tidb fail", "token", token, "podName", podName, "duration", d.Seconds())
		} else {
			a.V(1).Info("activate tidb success", "token", token, "podName", podName, "duration", d.Seconds())
		}
		metrics.Reclaimer.GetHistogramVec(metrics.ActivatorHistogramName, token).WithLabelValues(a.tidbPoolNamespace, rlt).Observe(d.Seconds())
	}()

	ctx, cancel := context.WithTimeout(ctx, activateTimeout)
	defer cancel()
	var exportID string
	if parts := strings.Split(token, ":"); len(parts) > 1 {
		exportID = parts[1]
	}
	metrics.ActivatorCounter.WithLabelValues(a.tidbPoolNamespace).Inc()
	return a.Activate(ctx, host, utils.TrimToken(token), exportID, param)
}
