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/replay/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
)

type Namespace struct {
	*task.BaseTask
}

func NewNamespace(ctx *task.Context) *Namespace {
	return &Namespace{
		BaseTask: &task.BaseTask{Context: ctx},
	}
}

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

func (t *Namespace) Create(ctx context.Context) deploy.Result {
	cli := t.Remote
	namespace := t.GetReplayNameSpace()

	ns := &corev1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: namespace,
			Labels: map[string]string{
				"app.kubernetes.io/name":      "replay",
				"app.kubernetes.io/instance":  t.Replay.Name,
				"app.kubernetes.io/component": "replay",
			},
		},
	}

	_, err := controllerutil.CreateOrUpdate(ctx, cli, ns, func() error { return nil })
	if err != nil {
		return deploy.Panic(err)
	}

	return deploy.Done()
}

func (t *Namespace) Delete(ctx context.Context) deploy.Result {
	cli := t.Remote
	namespace := t.GetReplayNameSpace()

	ns := &corev1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: namespace,
		},
	}

	if err := k8s.DeleteObjectCompleted(ctx, cli, ns); err != nil {
		return deploy.Panic(err)
	}

	return deploy.Done()
}
