apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-backend
  labels:
    {{- include "switchboard.backend.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.backend.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ .Chart.Name }}
      app.kubernetes.io/instance: {{ .Release.Name }}
      app.kubernetes.io/component: backend
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ .Chart.Name }}
        app.kubernetes.io/instance: {{ .Release.Name }}
        app.kubernetes.io/component: backend
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      # v0.32.0: Spread replicas across nodes for node-level HA.
      # preferred (not required) — if fewer nodes than replicas, pods
      # still schedule on the same node (degraded HA > no scheduling).
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app.kubernetes.io/name: {{ .Chart.Name }}
                    app.kubernetes.io/instance: {{ .Release.Name }}
                    app.kubernetes.io/component: backend
                topologyKey: kubernetes.io/hostname
      containers:
        - name: backend
          image: {{ include "switchboard.backend.image" . }}
          imagePullPolicy: {{ .Values.backend.image.pullPolicy }}
          ports:
            - name: http
              containerPort: {{ .Values.backend.port }}
              protocol: TCP
          envFrom:
            - configMapRef:
                name: {{ .Release.Name }}-config
            - secretRef:
                name: {{ include "switchboard.secretName" . }}
          env:
            - name: DATABASE_URL
              value: {{ include "switchboard.databaseURL" . | quote }}
          resources:
            {{- toYaml .Values.backend.resources | nindent 12 }}
          {{- if .Values.persistence.enabled }}
          volumeMounts:
            - name: data
              mountPath: /data
          {{- end }}
          # v0.32.0: Liveness — process alive (no dependency checks).
          livenessProbe:
            httpGet:
              path: {{ .Values.basePath }}/healthz/live
              port: http
            initialDelaySeconds: 10
            periodSeconds: 30
          # v0.32.0: Readiness — PG reachable. Failure pulls pod from Service.
          readinessProbe:
            httpGet:
              path: {{ .Values.basePath }}/healthz/ready
              port: http
            initialDelaySeconds: 5
            periodSeconds: 10
            failureThreshold: 3
      {{- if .Values.persistence.enabled }}
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: {{ .Release.Name }}-data
      {{- end }}
