package kubernetes

import (
	"net/http"
	"strings"

	"github.com/containous/traefik/log"
	"github.com/containous/traefik/types"
	"k8s.io/client-go/pkg/apis/extensions/v1beta1"
)

func getBoolAnnotation(meta *v1beta1.Ingress, name string, defaultValue bool) bool {
	annotationValue := defaultValue
	annotationStringValue, ok := meta.Annotations[name]
	switch {
	case !ok:
		// No op.
	case annotationStringValue == "false":
		annotationValue = false
	case annotationStringValue == "true":
		annotationValue = true
	default:
		log.Warnf("Unknown value %q for %q, falling back to %v", annotationStringValue, name, defaultValue)
	}
	return annotationValue
}

func getStringAnnotation(meta *v1beta1.Ingress, name string) string {
	value := meta.Annotations[name]
	return value
}

func getSliceAnnotation(meta *v1beta1.Ingress, name string) []string {
	var value []string
	if annotation, ok := meta.Annotations[name]; ok && annotation != "" {
		value = types.SplitAndTrimString(annotation)
	}
	if len(value) == 0 {
		log.Debugf("Could not load %v annotation, skipping...", name)
		return nil
	}
	return value
}

func getMapAnnotation(meta *v1beta1.Ingress, annotName string) map[string]string {
	if values, ok := meta.Annotations[annotName]; ok {

		if len(values) == 0 {
			log.Errorf("Missing value for annotation %q", annotName)
			return nil
		}

		mapValue := make(map[string]string)
		for _, parts := range strings.Split(values, "||") {
			pair := strings.SplitN(parts, ":", 2)
			if len(pair) != 2 {
				log.Warnf("Could not load %q: %v, skipping...", annotName, pair)
			} else {
				mapValue[http.CanonicalHeaderKey(strings.TrimSpace(pair[0]))] = strings.TrimSpace(pair[1])
			}
		}

		if len(mapValue) == 0 {
			log.Errorf("Could not load %q, skipping...", annotName)
			return nil
		}
		return mapValue
	}

	return nil
}
