package k8s

import (
	"context"
	"fmt"

	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	apiresource "github.com/pingcap/test-infra/common/model/resource"
	"github.com/pingcap/test-infra/sdk/resource"
)

var (
	_ resource.LoadBalancer = &LoadBalancer{}
)

type LoadBalancer struct {
	*KubeClientSet
	apiresource.LoadBalancer

	service *corev1.Service
}

func (l *LoadBalancer) Handle() apiresource.ResourceHandle {
	return l.LoadBalancer.ResourceHandle
}

func (l *LoadBalancer) Endpoint() (domainName string, port int) {
	return fmt.Sprintf("%s.%s", l.Name, l.Namespace), int(l.service.Spec.Ports[0].Port)
}

func (l *LoadBalancer) Sync() error {
	service, err := l.ClientSet.CoreV1().Services(l.Namespace).Get(context.TODO(), l.ResourceHandle.Name, metav1.GetOptions{})
	l.service = service
	l.LoadBalancer.ResourceHandle.Ready = &[]bool{true}[0]
	return err
}
