package controllers

import (
	"fmt"

	"github.com/seaweedfs/seaweedfs-operator/controllers/label"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/util/intstr"

	seaweedv1 "github.com/seaweedfs/seaweedfs-operator/api/v1"
)

func (r *SeaweedReconciler) createVolumeServerPeerService(m *seaweedv1.Seaweed) *corev1.Service {
	labels := labelsForVolumeServer(m.Name)

	dep := &corev1.Service{
		ObjectMeta: metav1.ObjectMeta{
			Name:      m.Name + "-volume-peer",
			Namespace: m.Namespace,
			Labels:    labels,
			Annotations: map[string]string{
				"service.alpha.kubernetes.io/tolerate-unready-endpoints": "true",
			},
		},
		Spec: corev1.ServiceSpec{
			ClusterIP:                "None",
			PublishNotReadyAddresses: true,
			Ports: []corev1.ServicePort{
				{
					Name:       "volume-http",
					Protocol:   corev1.Protocol("TCP"),
					Port:       seaweedv1.VolumeHTTPPort,
					TargetPort: intstr.FromInt(seaweedv1.VolumeHTTPPort),
				},
				{
					Name:       "volume-grpc",
					Protocol:   corev1.Protocol("TCP"),
					Port:       seaweedv1.VolumeGRPCPort,
					TargetPort: intstr.FromInt(seaweedv1.VolumeGRPCPort),
				},
			},
			Selector: labels,
		},
	}
	return dep
}
func (r *SeaweedReconciler) createVolumeServerService(m *seaweedv1.Seaweed, i int) *corev1.Service {
	labels := labelsForVolumeServer(m.Name)
	serviceName := fmt.Sprintf("%s-volume-%d", m.Name, i)
	labels[label.PodName] = serviceName

	dep := &corev1.Service{
		ObjectMeta: metav1.ObjectMeta{
			Name:      serviceName,
			Namespace: m.Namespace,
			Labels:    labels,
			Annotations: map[string]string{
				"service.alpha.kubernetes.io/tolerate-unready-endpoints": "true",
			},
		},
		Spec: corev1.ServiceSpec{
			PublishNotReadyAddresses: true,
			Ports: []corev1.ServicePort{
				{
					Name:       "volume-http",
					Protocol:   corev1.Protocol("TCP"),
					Port:       seaweedv1.VolumeHTTPPort,
					TargetPort: intstr.FromInt(seaweedv1.VolumeHTTPPort),
				},
				{
					Name:       "volume-grpc",
					Protocol:   corev1.Protocol("TCP"),
					Port:       seaweedv1.VolumeGRPCPort,
					TargetPort: intstr.FromInt(seaweedv1.VolumeGRPCPort),
				},
			},
			Selector: labels,
		},
	}

	if m.Spec.Volume.Service != nil {
		svcSpec := m.Spec.Volume.Service
		dep.Annotations = copyAnnotations(svcSpec.Annotations)

		if svcSpec.Type != "" {
			dep.Spec.Type = svcSpec.Type
		}

		if svcSpec.ClusterIP != nil {
			dep.Spec.ClusterIP = *svcSpec.ClusterIP
		}

		if svcSpec.LoadBalancerIP != nil {
			dep.Spec.LoadBalancerIP = *svcSpec.LoadBalancerIP
		}
	}

	return dep
}