/*
Copyright 2017 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package gce

import (
	"crypto/sha1"
	"encoding/hex"
	"fmt"
	"strings"

	"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud"
	"k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/types"
)

// Internal Load Balancer

// Instance groups remain legacy named to stay consistent with ingress
func makeInstanceGroupName(clusterID string) string {
	prefix := "k8s-ig"
	// clusterID might be empty for legacy clusters
	if clusterID == "" {
		return prefix
	}
	return fmt.Sprintf("%s--%s", prefix, clusterID)
}

func makeBackendServiceName(loadBalancerName, clusterID string, shared bool, scheme cloud.LbScheme, protocol v1.Protocol, svcAffinity v1.ServiceAffinity) string {
	if shared {
		hash := sha1.New()

		// For every non-nil option, hash its value. Currently, only service affinity is relevant.
		hash.Write([]byte(string(svcAffinity)))

		hashed := hex.EncodeToString(hash.Sum(nil))
		hashed = hashed[:16]

		// k8s-          4
		// {clusterid}-  17
		// {scheme}-     9   (internal/external)
		// {protocol}-   4   (tcp/udp)
		// nmv1-         5   (naming convention version)
		// {suffix}      16  (hash of settings)
		// -----------------
		//               55  characters used
		return fmt.Sprintf("k8s-%s-%s-%s-nmv1-%s", clusterID, strings.ToLower(string(scheme)), strings.ToLower(string(protocol)), hashed)
	}
	return loadBalancerName
}

func makeHealthCheckName(loadBalancerName, clusterID string, shared bool) string {
	if shared {
		return fmt.Sprintf("k8s-%s-node", clusterID)
	}

	return loadBalancerName
}

func makeHealthCheckFirewallNameFromHC(healthCheckName string) string {
	return healthCheckName + "-hc"
}

func makeHealthCheckFirewallName(loadBalancerName, clusterID string, shared bool) string {
	if shared {
		return fmt.Sprintf("k8s-%s-node-hc", clusterID)
	}
	return loadBalancerName + "-hc"
}

func makeBackendServiceDescription(nm types.NamespacedName, shared bool) string {
	if shared {
		return ""
	}
	return fmt.Sprintf(`{"kubernetes.io/service-name":"%s"}`, nm.String())
}

// External Load Balancer

// makeServiceDescription is used to generate descriptions for forwarding rules and addresses.
func makeServiceDescription(serviceName string) string {
	return fmt.Sprintf(`{"kubernetes.io/service-name":"%s"}`, serviceName)
}

// MakeNodesHealthCheckName returns name of the health check resource used by
// the GCE load balancers (l4) for performing health checks on nodes.
func MakeNodesHealthCheckName(clusterID string) string {
	return fmt.Sprintf("k8s-%v-node", clusterID)
}

func makeHealthCheckDescription(serviceName string) string {
	return fmt.Sprintf(`{"kubernetes.io/service-name":"%s"}`, serviceName)
}

// MakeHealthCheckFirewallName returns the firewall name used by the GCE load
// balancers (l4) for performing health checks.
func MakeHealthCheckFirewallName(clusterID, hcName string, isNodesHealthCheck bool) string {
	if isNodesHealthCheck {
		return MakeNodesHealthCheckName(clusterID) + "-http-hc"
	}
	return "k8s-" + hcName + "-http-hc"
}

// MakeFirewallName returns the firewall name used by the GCE load
// balancers (l4) for serving traffic.
func MakeFirewallName(name string) string {
	return fmt.Sprintf("k8s-fw-%s", name)
}

func makeFirewallDescription(serviceName, ipAddress string) string {
	return fmt.Sprintf(`{"kubernetes.io/service-name":"%s", "kubernetes.io/service-ip":"%s"}`,
		serviceName, ipAddress)
}
