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

import (
	"context"

	"github.com/pingcap/tiflow-operator/api/label"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/util/intstr"
	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

	"github.com/tidbcloud/eks-provider/controllers/replay/task"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
)

type Service struct {
	*task.BaseTask
}

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

func NewService(ctx *task.Context) *Service {
	return &Service{
		BaseTask: &task.BaseTask{Context: ctx},
	}
}

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

	svc := t.describeService()
	clusterCli := t.Remote
	if _, err := controllerutil.CreateOrUpdate(ctx, clusterCli, svc, func() error { return nil }); err != nil {
		return deploy.Error(err)
	}
	t.Replay.Status.Phase = cloudv1.ReplayCreating
	return deploy.Done()
}

func (t *Service) Delete(ctx context.Context) deploy.Result {
	svc := &corev1.Service{
		ObjectMeta: metav1.ObjectMeta{
			Name:      t.Replay.Name,
			Namespace: t.GetReplayNameSpace(),
		},
	}
	clusterCli := t.Remote
	return deploy.ErrorOrDone(k8s.DeleteObject(ctx, clusterCli, svc))
}

func (t *Service) describeService() *corev1.Service {

	ns := t.GetReplayNameSpace()
	name := t.Replay.Name

	selector := map[string]string{
		label.NameLabelKey: t.Replay.Name,
	}

	svc := &corev1.Service{
		ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: ns,
		},
		Spec: corev1.ServiceSpec{
			ClusterIP: corev1.ClusterIPNone,
			Selector:  selector,
			Ports: []corev1.ServicePort{
				{
					Name:       "replayer",
					Protocol:   corev1.ProtocolTCP,
					Port:       task.DefaultSvcPort,
					TargetPort: intstr.FromInt32(task.DefaultSvcPort),
				},
				{
					Name:       "http-test",
					Protocol:   corev1.ProtocolTCP,
					Port:       8081,
					TargetPort: intstr.FromInt32(8081),
				},
			},
		},
	}
	return svc
}
