package client

var templates = map[string]string{
	"deployment":     deploymentTmpl,
	"service":        serviceTmpl,
	"namespace":      namespaceTmpl,
	"secret":         secretTmpl,
	"serviceaccount": serviceAccountTmpl,
}

var deploymentTmpl = `
apiVersion: apps/v1
kind: Deployment
metadata:
  name: "{{ .Metadata.Name }}"
  namespace: "{{ .Metadata.Namespace }}"
  labels:
    {{- with .Metadata.Labels }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
  annotations:
    {{- with .Metadata.Annotations }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
spec:
  replicas: {{ .Spec.Replicas }}
  selector:
    matchLabels:
      {{- with .Spec.Selector.MatchLabels }}
      {{- range $key, $value := . }}
      {{ $key }}: "{{ $value }}"
      {{- end }}
      {{- end }}
  template:
    metadata:
      labels:
        {{- with .Spec.Template.Metadata.Labels }}
        {{- range $key, $value := . }}
        {{ $key }}: "{{ $value }}"
        {{- end }}
        {{- end }}
      annotations:
        {{- with .Spec.Template.Metadata.Annotations }}
        {{- range $key, $value := . }}
        {{ $key }}: "{{ $value }}"
        {{- end }}
        {{- end }}
    spec: 
      serviceAccountName: {{ .Spec.Template.PodSpec.ServiceAccountName }}
      containers:
      {{- with .Spec.Template.PodSpec.Containers }}
      {{- range . }}
        - name: {{ .Name }}
          env:
          {{- with .Env }}
          {{- range . }}
          - name: "{{ .Name }}"
            value: "{{ .Value }}"
          {{- if .ValueFrom }}
          {{- with .ValueFrom }}
            valueFrom: 
              {{- if .SecretKeyRef }}
              {{- with .SecretKeyRef }}
              secretKeyRef:
                key: {{ .Key }}
                name: {{ .Name }}
                optional: {{ .Optional }}
              {{- end }}
              {{- end }}
          {{- end }}
          {{- end }}
          {{- end }}
          {{- end }}
          args:
          {{- range .Args }}
          - {{.}}
          {{- end }}
          command:
          {{- range .Command }}
          - {{.}}
          {{- end }}
          image: {{ .Image }}
          imagePullPolicy: Always
          ports:
          {{- with .Ports }}
          {{- range . }}
          - containerPort: {{ .ContainerPort }}
            name: {{ .Name }}
          {{- end }}
          {{- end }}
          {{- if .ReadinessProbe }}
          {{- with .ReadinessProbe }}
          readinessProbe:
            {{- with .TCPSocket }}
            tcpSocket:
              {{- if .Host }}
              host: {{ .Host }}
              {{- end }}
              port: {{ .Port }}
            {{- end }}
            initialDelaySeconds: {{ .InitialDelaySeconds }}
            periodSeconds: {{ .PeriodSeconds }}
          {{- end }}
          {{- end }}
          {{- if .Resources }}
          {{- with .Resources }}
          resources:
            {{- if .Limits }}
            {{- with .Limits }}
            limits:
              {{- if .Memory }}
              memory: {{ .Memory }}
              {{- end }}
              {{- if .CPU }}
              cpu: {{ .CPU }}
              {{- end }}
              {{- if .EphemeralStorage }}
              ephemeral-storage: {{ .EphemeralStorage }}
              {{- end }}
            {{- end }}
            {{- end }}
            {{- if .Requests }}
            {{- with .Requests }}
            requests:
              {{- if .Memory }}
              memory: {{ .Memory }}
              {{- end }}
              {{- if .CPU }}
              cpu: {{ .CPU }}
              {{- end }}
              {{- if .EphemeralStorage }}
              ephemeral-storage: {{ .EphemeralStorage }}
              {{- end }}
            {{- end }}
            {{- end }}
          {{- end }}
          {{- end }}
      {{- end }}
      {{- end }}
`

var serviceTmpl = `
apiVersion: v1
kind: Service
metadata:
  name: "{{ .Metadata.Name }}"
  namespace: "{{ .Metadata.Namespace }}"
  labels:
    {{- with .Metadata.Labels }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
spec:
  selector:
    {{- with .Spec.Selector }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
  ports:
  {{- with .Spec.Ports }}
  {{- range . }}
  - name: "{{ .Name }}"
    port: {{ .Port }}
    protocol: {{ .Protocol }}
  {{- end }}
  {{- end }}
`

var namespaceTmpl = `
apiVersion: v1
kind: Namespace
metadata:
  name: "{{ .Metadata.Name }}"
  labels:
    {{- with .Metadata.Labels }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
`

var secretTmpl = `
apiVersion: v1
kind: Secret
type: "{{ .Type }}"
metadata:
  name: "{{ .Metadata.Name }}"
  namespace: "{{ .Metadata.Namespace }}"
  labels:
    {{- with .Metadata.Labels }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
data:
  {{- with .Data }}
  {{- range $key, $value := . }}
  {{ $key }}: "{{ $value }}"
  {{- end }}
  {{- end }}
`

var serviceAccountTmpl = `
apiVersion: v1
kind: ServiceAccount
metadata:
  name: "{{ .Metadata.Name }}"
  labels:
    {{- with .Metadata.Labels }}
    {{- range $key, $value := . }}
    {{ $key }}: "{{ $value }}"
    {{- end }}
    {{- end }}
imagePullSecrets:
{{- with .ImagePullSecrets }}
{{- range . }}
- name: "{{ .Name }}"
{{- end }}
{{- end }}
`