package gke

import (
	"context"
	"fmt"
	"time"

	"github.com/tidbcloud/infra-provider/pkg/cloud/gcp"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/appbox/task"
)

// ManagedMonitoring is a task to disable manage monitoring for GKE cluster.
type ManagedMonitoring struct {
	*task.BaseTask
	gcpCli gcp.Client
}

func NewManagedMonitoring(ctx *task.Context, gcpCli gcp.Client) *ManagedMonitoring {
	return &ManagedMonitoring{
		BaseTask: &task.BaseTask{Context: ctx},
		gcpCli:   gcpCli,
	}
}

func (t *ManagedMonitoring) Name() string {
	return "ManagedMonitoring"
}

func (t *ManagedMonitoring) Create(ctx context.Context) deploy.Result {
	// at present, we only disable the managed monitoring for the migrated gke cluster
	if t.APPBox.GetLabels()[v1alpha1.IsLegacyKey] != "true" {
		return deploy.Done()
	}
	if err := t.disableManagedPrometheus(ctx); err != nil {
		// this task is not an blocking task, so we don't need to return a panic error.
		return deploy.Error(fmt.Errorf("failed to disable monitoring: %v", err)).WithRequeuAfter(30 * time.Second)
	}
	return deploy.Done()
}

// disableManagedPrometheus will disable the managed prometheus for the gke cluster
func (t *ManagedMonitoring) disableManagedPrometheus(ctx context.Context) error {
	// if the managed prometheus is not enabled, `DisableManagedPrometheus` will return nil
	_, err := t.gcpCli.DisableManagedPrometheus(ctx, t.ProjectID(), t.APPBox.Spec.Region, t.GKEName())
	if err != nil {
		return err
	}
	return nil
}
