{{- $jenkinsHome := .Values.controller.jenkinsHome -}}

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ template "jenkins.fullname" . }}
  namespace: {{ template "jenkins.namespace" . }}
  labels:
    "app.kubernetes.io/name": '{{ template "jenkins.name" .}}'
    "app.kubernetes.io/managed-by": "{{ .Release.Service }}"
    "app.kubernetes.io/instance": "{{ .Release.Name }}"
    "app.kubernetes.io/component": "{{ .Values.controller.componentName }}"
data:
  apply_config.sh: |-
    set -e
{{- if .Values.controller.initializeOnce }}
    if [ -f {{ .Values.controller.jenkinsHome }}/initialization-completed ]; then
      echo "controller was previously initialized, refusing to re-initialize"
      exit 0
    fi
{{- end }}
    echo "disable Setup Wizard"
    # Prevent Setup Wizard when JCasC is enabled
    echo $JENKINS_VERSION > {{ .Values.controller.jenkinsHome }}/jenkins.install.UpgradeWizard.state
    echo $JENKINS_VERSION > {{ .Values.controller.jenkinsHome }}/jenkins.install.InstallUtil.lastExecVersion
{{- if .Values.controller.overwritePlugins }}
    echo "remove all plugins from shared volume"
    # remove all plugins from shared volume
    rm -rf {{ .Values.controller.jenkinsHome }}/plugins/*
{{- end }}
{{- if .Values.controller.JCasC.overwriteConfiguration }}
    echo "deleting all XML config files"
    rm -f {{ .Values.controller.jenkinsHome }}/config.xml
    rm -f {{ .Values.controller.jenkinsHome }}/*plugins*.xml
    find {{ .Values.controller.jenkinsHome }} -maxdepth 1 -type f -iname '*configuration*.xml' -exec rm -f {} \;
{{- end }}
{{- if .Values.controller.installPlugins }}
    echo "download plugins"
    # Install missing plugins
    cp /var/jenkins_config/plugins.txt {{ .Values.controller.jenkinsHome }};
    rm -rf {{ .Values.controller.jenkinsRef }}/plugins/*.lock
    version () { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
    if [ -f "{{ .Values.controller.jenkinsWar }}" ] && [ -n "$(command -v jenkins-plugin-cli)" 2>/dev/null ] && [ $(version $(jenkins-plugin-cli --version)) -ge $(version "2.1.1") ]; then
      jenkins-plugin-cli --verbose --war "{{ .Values.controller.jenkinsWar }}" --plugin-file "{{ .Values.controller.jenkinsHome }}/plugins.txt" --latest {{ .Values.controller.installLatestPlugins }}{{- if .Values.controller.installLatestSpecifiedPlugins }} --latest-specified{{- end }};
    else
      /usr/local/bin/install-plugins.sh `echo $(cat {{ .Values.controller.jenkinsHome }}/plugins.txt)`;
    fi
    echo "copy plugins to shared volume"
    # Copy plugins to shared volume
    yes n | cp -i {{ .Values.controller.jenkinsRef }}/plugins/* /var/jenkins_plugins/;
{{- end }}
  {{- if not .Values.controller.sidecars.configAutoReload.enabled }}
    echo "copy configuration as code files"
    mkdir -p {{ .Values.controller.jenkinsHome }}/casc_configs;
    rm -rf {{ .Values.controller.jenkinsHome }}/casc_configs/*
    {{- if or .Values.controller.JCasC.defaultConfig .Values.controller.JCasC.configScripts }}
    cp -v /var/jenkins_config/*.yaml {{ .Values.controller.jenkinsHome }}/casc_configs
    {{- end }}
  {{- end }}
    echo "finished initialization"
{{- if .Values.controller.initializeOnce }}
    touch {{ .Values.controller.jenkinsHome }}/initialization-completed
{{- end }}
  {{- if not .Values.controller.sidecars.configAutoReload.enabled }}
# Only add config to this script if we aren't auto-reloading otherwise the pod will restart upon each config change:
{{- if .Values.controller.JCasC.defaultConfig }}
  jcasc-default-config.yaml: |-
    {{- include "jenkins.casc.defaults" . |nindent 4}}
{{- end }}
{{- range $key, $val := .Values.controller.JCasC.configScripts }}
  {{ $key }}.yaml: |-
{{ tpl $val $| indent 4 }}
{{- end }}
{{- end }}
  plugins.txt: |-
{{- if .Values.controller.installPlugins }}
  {{- range $installPlugin := .Values.controller.installPlugins }}
    {{- $installPlugin | nindent 4 }}
  {{- end }}
  {{- range $addlPlugin := .Values.controller.additionalPlugins }}
    {{- /* duplicate plugin check */}}
    {{- range $installPlugin := $.Values.controller.installPlugins }}
      {{- if eq (splitList ":" $addlPlugin | first) (splitList ":" $installPlugin | first) }}
        {{- $message := print "[PLUGIN CONFLICT] controller.additionalPlugins contains '" $addlPlugin "'" }}
        {{- $message := print $message " but controller.installPlugins already contains '" $installPlugin "'." }}
        {{- $message := print $message " Override controller.installPlugins to use '" $addlPlugin "' plugin." }}
        {{- fail $message }}
      {{- end }}
    {{- end }}
    {{- $addlPlugin | nindent 4 }}
  {{- end }}
{{- end }}
