// Package common add by blacknc <blacknc@163.com> at 2024/08/28 17:17:20
package common

import (
	"context"

	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

	"github.com/tidbcloud/eks-provider/controllers/imports/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
)

const (
	lightningConfigFileName = "tidb-lightning.toml"
)

type Secret struct {
	*task.BaseTask
}

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

func NewSecret(ctx *task.Context) *Secret {
	return &Secret{
		BaseTask: &task.BaseTask{Context: ctx},
	}
}

func (t *Secret) Create(ctx context.Context) deploy.Result {

	secret := t.describeSecret()
	clusterCli := t.EnvProvider.GetClient()
	if _, err := controllerutil.CreateOrUpdate(ctx, clusterCli, secret, func() error { return nil }); err != nil {
		return deploy.Error(err)
	}
	return deploy.Done()
}

func (t *Secret) Delete(ctx context.Context) deploy.Result {
	if !t.IsClusterExist() {
		return deploy.Done()
	}
	secret := &corev1.Secret{
		ObjectMeta: metav1.ObjectMeta{
			Name:      t.Import.Name,
			Namespace: t.GetClusterNameSpace(),
		},
	}
	clusterCli := t.EnvProvider.GetClient()
	return deploy.ErrorOrDone(k8s.DeleteObject(ctx, clusterCli, secret))
}

func (t *Secret) describeSecret() *corev1.Secret {

	ns := t.GetClusterNameSpace()
	name := t.Import.Name
	secret := &corev1.Secret{
		ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: ns,
			Labels:    t.LightningLabels,
		},
		Data: map[string][]byte{
			lightningConfigFileName: t.LightningConfig,
		},
	}
	return secret
}
