package common

import (
	"context"

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

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

type DMNamespace struct {
	*task.BaseTask
}

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

func NewDMNamespace(ctx *task.Context) *DMNamespace {
	return &DMNamespace{
		BaseTask: &task.BaseTask{Context: ctx},
	}
}

func (t *DMNamespace) Create(ctx context.Context) deploy.Result {
	namespace := GetDMClusterNamespace(t.DMJob, t.GetRegion())

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

	if err := t.EnvProvider.GetClient().Create(ctx, ns); err != nil {
		if apierrors.IsAlreadyExists(err) {
			return deploy.Result{}
		}
		return deploy.Error(err)
	}

	return deploy.Result{}
}

func (t *DMNamespace) PostCreate(ctx context.Context) deploy.Result {

	namespace := GetDMClusterNamespace(t.DMJob, t.GetRegion())
	ns := &corev1.Namespace{
		ObjectMeta: metav1.ObjectMeta{
			Name: namespace,
		},
	}
	if err := t.EnvProvider.GetClient().Get(ctx, client.ObjectKeyFromObject(ns), ns); err != nil {
		return deploy.Error(err)
	}
	return deploy.Done()
}
