#!/usr/bin/env bash

{{ includeTemplate "universal/profile" }}
{{ includeTemplate "universal/logg" }}

{{ $roleDirs := (output "find" (joinPath .chezmoi.homeDir ".local" "src" "gas-station" "roles") "-mindepth" "2" "-maxdepth" "2" "-type" "d") -}}
{{- range $roleDir := splitList "\n" $roleDirs -}}
{{- if ne $roleDir "" -}}
# {{ $roleDir }}
{{- end -}}
{{- end }}

logg info 'Ensuring Gas Station roles are symlinked to ~/.local/share/ansible/roles'
mkdir -p "$XDG_DATA_HOME/ansible/roles"
find "$HOME/.local/src/gas-station/roles" -mindepth 2 -maxdepth 2 -type d | while read ROLE_PATH; do
  ROLE_FOLDER="professormanhattan.$(echo "$ROLE_PATH" | sed 's/.*\/\([^\/]*\)$/\1/')"
  ALT_ROLE_FOLDER="$(echo "$ROLE_PATH" | sed 's/.*\/\([^\/]*\)$/\1/')"
  if [ ! -d "$XDG_DATA_HOME/ansible/roles/$ROLE_FOLDER" ] || [ "$(readlink -f "$XDG_DATA_HOME/ansible/roles/$ROLE_FOLDER")" != "$ROLE_PATH" ]; then
    logg info 'Symlinking `'"$ROLE_FOLDER"'`'
    rm -f "$XDG_DATA_HOME/ansible/roles/$ROLE_FOLDER"
    ln -s "$ROLE_PATH" "$XDG_DATA_HOME/ansible/roles/$ROLE_FOLDER"
  fi
  if [ ! -d "$XDG_DATA_HOME/ansible/roles/$ALT_ROLE_FOLDER" ] || [ "$(readlink -f "$XDG_DATA_HOME/ansible/roles/$ALT_ROLE_FOLDER")" != "$ROLE_PATH" ]; then
    rm -f "$XDG_DATA_HOME/ansible/roles/$ALT_ROLE_FOLDER"
    ln -s "$ROLE_PATH" "$XDG_DATA_HOME/ansible/roles/$ALT_ROLE_FOLDER"
  fi
done

if [ -f "$HOME/.local/src/gas-station/requirements.yml" ]; then
  if command -v ansible-galaxy > /dev/null; then
    logg info 'Ensuring Ansible Galaxy collections are installed'
    export ANSIBLE_CONFIG="$HOME/.local/share/ansible/ansible.cfg"
    ansible-galaxy install -r "$HOME/.local/share/ansible/requirements.yml" || EXIT_CODE=$?
    if [ -n "$EXIT_CODE" ]; then
      logg error 'Failed to install Ansible requirements from Ansible Galaxy'
      if [ -d "$HOME/.local/src/gas-station/collections" ]; then
        logg info 'Attempting to use locally stored Ansible requirements'
        cd "$HOME/.local/src/gas-station/collections"
        ansible-galaxy install -r requirements.yml || SECOND_EXIT_CODE=$?
        if [ -n "$SECOND_EXIT_CODE" ]; then
          logg error 'Failed to install requirements from both the cloud and the local copy' && exit 1
        fi
      else
        logg warn '~/.local/src/gas-station/collections is missing'
      fi
    fi
  else
    logg warn 'Unable to install the Ansible Galaxy requirements.yml since the ansible-galaxy executable is missing from the PATH'
  fi
else
  logg warn '~/.local/share/ansible/requirements.yml is missing'
fi
