{{- define "env" -}}
{{- $env := default "qa" .Values.env -}}
{{- printf "%s" $env | trunc 63 | trimSuffix "-" }}
{{- end -}}

{{- define "keelPolicy" -}}
{{- $env := include "env" . -}}
{{- $keelPolicy := default "patch" .Values.keel.policy }}
{{- printf "%s" $keelPolicy -}}
{{- end -}}

{{- define "keelProvider" -}}
{{- printf "%s" default "kubernetes" .Values.keel.provider -}}
{{- end -}}

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert -f dev/docker-compose.drakemall.yml -c
    kompose.service.type: loadbalancer
    keel.sh/pollSchedule: "@every 15s"
  creationTimestamp: null
  labels:
    app: {{ template "drakemall.fullname" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
    heritage: {{ .Release.Service }}
    release: {{ .Release.Name }}
    {{ if and .Values.keel }}
    {{ if .Values.keel.provider }}
    {{ if eq .Values.keel.provider "kubernetes" }}
    keel.sh/policy: {{ template "keelPolicy" . }}
    keel.sh/trigger: {{ default "poll" .Values.keel.trigger }}
    {{ end }}
    {{ end }}
    {{ end }}
  name: {{ template "drakemall.fullname" . }}
spec:
  replicas: {{ .Values.drakemall.replicaCount }}
  minReadySeconds: 25
  strategy:
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 50%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: {{ template "drakemall.fullname" . }}
        app: {{ template "drakemall.fullname" . }}
        chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
        heritage: {{ .Release.Service }}
        release: {{ .Release.Name }}
      annotations:
        checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
    spec:
      serviceAccountName: {{ required "Service account is required" .Values.serviceAccountName }}
      containers:
      - env:
{{ toYaml .Values.drakemall.env | indent 8 }}
        - name: DOMAIN_NAME
          value: {{ .Values.domain_name }}
        - name: PORT
          value: "5000"
        {{ if .Values.mailcatcher }}
        {{ if .Values.mailcatcher.enabled }}
        - name: SMTP_URL
          value: {{ template "smtp_url" . }}
        {{ end }}
        {{ end }}
        - name: VAULT_ADDR
          value: {{ required "Vault API address must be provided" .Values.vault.addr }}
        - name: VAULT_CONFIG_KEYS
          value: {{ .Values.vault.app.configkeys }}
        - name: VAULT_ENABLE
          {{ if .Values.vault.app.enable }}
          value: "yes"
          {{ else }}
          value: "no"
          {{ end }}
        - name: VAULT_TOKEN
          valueFrom:
            secretKeyRef:
              name: {{ template "vault-token.fullname" . }}
              key: token
        image: {{ .Values.drakemall.image }}:{{ .Values.drakemall.tag }}
        imagePullPolicy: {{ default "IfNotPresent" .Values.drakemall.imagePullPolicy }}
        livenessProbe:
          exec:
            command:
            - curl
            - -f
            - http://127.0.0.1:5000/
          initialDelaySeconds: 10
          failureThreshold: 2
          periodSeconds: 20
          timeoutSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 5000
          initialDelaySeconds: 5
          successThreshold: 1
          timeoutSeconds: 3
        name: apigateway
        ports:
        - containerPort: 5000
        resources:
          limits:
            memory: "2048Mi"
          requests:
            memory: "64Mi"
        terminationGracePeriodSeconds: 60s
      - env:
        - name: DOMAIN_NAME
          value: {{ required "Domain name is required" .Values.domain_name }}
        - name: PORT
          value: "80"
        - name: API_GATEWAY_SERVER
          value: 127.0.0.1:5000
        - name: NAMESERVERS
          value: 8.8.8.8
        - name: COUNTY_BLACKLIST
          value: {{ default "FOO" .Values.firewall.country_blacklist }}
        {{ if not .Values.seo.enabled }}
        - name: WEB_SERVICE_URL
          value: {{ .Values.domain_name }}
        - name: PRERENDER_HOST
          value: service.prerender.io
        {{ else if .Values.prerender.enabled }}
        - name: WEB_SERVICE_URL
          value: {{ required "LoadBalancer IP is required, used by service.prerender.io" .Values.service.loadBalancerIP }}
        - name: PRERENDER_HOST
          value: {{ required "Prerender.io service url is required" .Values.prerender.service_url }}
        {{ else if .Values.prerender_chrome_headless.enabled }}
        # FIXME: not well tested
        - name: WEB_SERVICE_URL
          value: {{ template "drakemall.fullname" . }}:5000
        - name: PRERENDER_HOST
          value: {{ template "prerender.fullname" . }}:3000
        {{end}}
        {{ if .Values.sitemap.enabled }}
        - name: SITEMAP_SERVER
          value: "127.0.0.1:8090"
        {{ end }}
        image: {{ .Values.frontend.image }}:{{ .Values.frontend.tag }}
        imagePullPolicy: {{ default "IfNotPresent" .Values.frontend.imagePullPolicy }}
        name: nginx-proxy
        readinessProbe:
          httpGet:
            path: /assets/healthy.html
            port: 80
          periodSeconds: 1
          successThreshold: 1
          failureThreshold: 2
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: "2048Mi"
          requests:
            memory: "64Mi"
        {{ if not .Values.seo.enabled }}
        volumeMounts:
          - name: nginx-config
            mountPath: /etc/nginx/conf.d/headers.conf
            subPath: headers.conf
          - name: nginx-config
            mountPath: /var/wwww/site/dist/robots.txt
            subPath: robots.txt
        {{- end }}
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "rm /var/wwww/site/dist/assets/healthy.html && sleep 10"]
        terminationGracePeriodSeconds: 60s
      {{ if .Values.sitemap.enabled }}
      - env:
        - name: DRAKEMALL_API_ADDR
          value: http://127.0.0.1:5000
        - name: SITEMAP_HOSTNAME
          value: https://{{ required "Domain name is required" .Values.domain_name }}
        name: sitemap
        image: {{ .Values.sitemap.image }}:{{ .Values.sitemap.tag }}
        imagePullPolicy: IfNotPresent
        livenessProbe:
          exec:
            command:
            - curl
            - -f
            - http://localhost:8090/health
          initialDelaySeconds: 10
          failureThreshold: 2
          periodSeconds: 10
          timeoutSeconds: 10
        resources:
          limits:
            memory: "128Mi"
          requests:
            memory: "64Mi"
      {{ end }}
      restartPolicy: Always
      {{ if .Values.minikube.enabled }}
      imagePullSecrets: 
      - name: dpr-secret
      {{ end }}
      {{ if not .Values.seo.enabled }}
      volumes:
      - name: nginx-config
        configMap: 
          name: {{ template "drakemall.fullname" . }}-nginx-custom-headers
          items:
            - key: nginx_custom_headers
              path: headers.conf
            - key: robots_txt
              path: robots.txt
      {{ end }}
status: {}