package ingress

import (
	"k8s.io/api/networking/v1beta1"
)

func buildIngress(opts ...func(*v1beta1.Ingress)) *v1beta1.Ingress {
	i := &v1beta1.Ingress{}
	i.Kind = "Ingress"
	for _, opt := range opts {
		opt(i)
	}
	return i
}

func iNamespace(value string) func(*v1beta1.Ingress) {
	return func(i *v1beta1.Ingress) {
		i.Namespace = value
	}
}

func iRules(opts ...func(*v1beta1.IngressSpec)) func(*v1beta1.Ingress) {
	return func(i *v1beta1.Ingress) {
		s := &v1beta1.IngressSpec{}
		for _, opt := range opts {
			opt(s)
		}
		i.Spec = *s
	}
}

func iRule(opts ...func(*v1beta1.IngressRule)) func(*v1beta1.IngressSpec) {
	return func(spec *v1beta1.IngressSpec) {
		r := &v1beta1.IngressRule{}
		for _, opt := range opts {
			opt(r)
		}
		spec.Rules = append(spec.Rules, *r)
	}
}

func iHost(name string) func(*v1beta1.IngressRule) {
	return func(rule *v1beta1.IngressRule) {
		rule.Host = name
	}
}

func iTLSes(opts ...func(*v1beta1.IngressTLS)) func(*v1beta1.Ingress) {
	return func(i *v1beta1.Ingress) {
		for _, opt := range opts {
			iTLS := v1beta1.IngressTLS{}
			opt(&iTLS)
			i.Spec.TLS = append(i.Spec.TLS, iTLS)
		}
	}
}

func iTLS(secret string, hosts ...string) func(*v1beta1.IngressTLS) {
	return func(i *v1beta1.IngressTLS) {
		i.SecretName = secret
		i.Hosts = hosts
	}
}