## arg 1:  the new package version
## arg 2:  the old package version
# shellcheck disable=SC2016

users=$(loginctl --no-legend list-users | awk '{ print $2 }' | sed ':a;N;$!ba;s/\n/ /g')

pre_upgrade() {
  # version 6.00 is a major rebuild
  # yes, I realize that pacman should not stop services but in this case it
  # is required or else browser profiles (user data) can get renamed and confuse
  # people if it does not happen
  if [ "$(vercmp "$2" 6.00)" -lt 0 ]; then
    echo 'Attention: Major changes have been introduced with 6.00+'
    echo 'Instead of a system service a user service is now used.'
    echo 'Only $HOME/.config/psd/psd.conf is used (and automatically created on first start).'
    echo 'To use overlayfs additional setup steps are required (see `man 1 psd`).'

    # stop system service now since it will be removed upon updating
    if systemctl is-active psd.service &>/dev/null; then
      systemctl stop psd.service &>/dev/null
    fi
  fi

  # version 6.01 redefines the location of tmpfs for the software so it is
  # required that pacman stop the user service here if running
  if [ "$(vercmp "$2" 6.01)" -lt 0 ]; then
    for user in $users; do
      if _psd_running_for_user "$user"; then
        _stop_psd_for_user "$user"
        _diff_recommendation
      fi
    done
  fi

  if [ "$(vercmp "$2" 6.03)" -lt 0 ]; then
    for user in $users; do
      HOMEDIR="$(getent passwd "$user" | cut -d: -f6)"
      if [[ -d "$HOMEDIR"/.psd ]]; then
        echo 'The use of $HOME/.psd for configuration is deprecated.'
        echo 'Psd will move it for you upon next invocation to $XDG_CONFIG_HOME/psd'
      fi
    done

    # version 6.05 impliments changes to both the service and the way overlayfs is mounted/umount
    # so it is required that pacman stop the user service here if running
    if [ "$(vercmp "$2" 6.05)" -lt 0 ]; then
      for user in $users; do
        if _psd_running_for_user "$user"; then
          _stop_psd_for_user "$user"
          echo 'Users of overlayfs: Before starting the service `psd p` must be run.'
        fi
      done
    fi
  fi

  # version 6.07 has minor changes to config file
  if [ "$(vercmp "$2" 6.07)" -lt 0 ]; then
    _diff_recommendation
  fi

  # version 6.10 relocates pid file
  if [ "$(vercmp "$2" 6.10)" -lt 0 ]; then
    for user in $users; do
      if _psd_running_for_user "$user"; then
        _stop_psd_for_user "$user"
      fi
    done
  fi

  # version 6.14 changes the way overlayfs works
  if [ "$(vercmp "$2" 6.14)" -lt 0 ]; then
    for user in $users; do
      if _psd_running_for_user "$user"; then
        _stop_psd_for_user "$user"
      fi
    done
  fi

  # version 6.16 has minor changes to config file
  if [ "$(vercmp "$2" 6.16)" -lt 0 ]; then
    _diff_recommendation
  fi

  # version 6.22 has minor changes to config file
  if [ "$(vercmp "$2" 6.22)" -lt 0 ]; then
    _diff_recommendation
  fi

  # version 6.30 has minor changes to config file
  if [ "$(vercmp "$2" 6.30)" -lt 0 ]; then
    _diff_recommendation
  fi

  # version 6.40 has minor changes to config file
  if [ "$(vercmp "$2" 6.40)" -lt 0 ]; then
    _diff_recommendation
  fi

  # version 6.46 redefines the location of tmpfs for the software so it is
  # required that pacman stop the user service here if running
  if [ "$(vercmp "$2" 1:6.46)" -lt 0 ]; then
    for user in $users; do
      if _psd_running_for_user "$user"; then
        _stop_psd_for_user "$user"
      fi
    done
  fi

}

post_upgrade() {
  # version 6.01 redefines the location of tmpfs for the software so it is
  # required that pacman stop the user service here if running
  if [ "$(vercmp "$2" 6.01)" -lt 0 ]; then
    _daemon_refresh
  fi

  # version 6.05 impliments changes to both the service and the way overlayfs is mounted/umount
  # so it is required that pacman stop the user service here if running
  if [ "$(vercmp "$2" 6.05)" -lt 0 ]; then
    _daemon_refresh
  fi

  # version 6.10 relocates pid file
  if [ "$(vercmp "$2" 6.10)" -lt 0 ]; then
    _daemon_refresh
  fi

  # version 6.11 modified services
  if [ "$(vercmp "$2" 6.11)" -lt 0 ]; then
    _daemon_refresh
  fi

  # version 6.14 modified services
  if [ "$(vercmp "$2" 6.14)" -lt 0 ]; then
    _daemon_refresh
  fi
}

pre_remove() {
  for user in $users; do
    if _psd_running_for_user "$user"; then
      _stop_psd_for_user "$user"
    fi
  done
}

_daemon_refresh() {
  for i in $users; do
    su "$i" -s /bin/sh -c 'XDG_RUNTIME_DIR=/run/user/$UID systemctl --user daemon-reload'
  done
}

_psd_running_for_user() {
  running="$(su "$1" -s /bin/sh -c 'XDG_RUNTIME_DIR=/run/user/$UID systemctl --user is-active psd')"
  if [[ "$running" = "active" ]]; then
    return 0
  else
    return 1
  fi
}

_stop_psd_for_user() {
  echo "In order to preserve the browser profiles, all psd user services will be stopped."
  echo "Any running and managed browsers will be exited."
  su "$1" -s /bin/sh -c 'XDG_RUNTIME_DIR=/run/user/$UID systemctl --user stop psd.service'
}

_diff_recommendation() {
  echo 'It is recommend to diff /usr/share/psd/psd.conf against ~/.config/psd/psd.conf'
}
