#!/bin/sh

# pypkg.sh
# 2022-12-26
# by Gernot Walzl

# This script uses apt and pip to install Python packages.
# If the requested package is available in an apt repository,
# the package is installed system-wide using apt. Otherwise,
# pip is used to install the package for the user locally.

PYTHON='python3'

set -e

print_usage () {
  echo "Usage:"
  echo "  $0 { pip-install | pip-upgrade | pip-uninstall } PKG"
  echo "  $0 { pip-list-installed | pip-upgrade-installed }"
  echo "  $0 { apt-search | apt-install } PKG"
  echo "  $0 install PKG"
  echo "  $0 apt-replace-pip-installed"
}

pip_install () {
  $PYTHON -m pip install --user "$1"
}

pip_upgrade () {
  $PYTHON -m pip install --user --upgrade "$1"
}

pip_uninstall () {
  $PYTHON -m pip uninstall "$1"
}

pip_list_installed () {
  $PYTHON -m pip list --verbose | grep 'pip$'
}

pip_upgrade_installed () {
  PKGS="$(pip_list_installed | cut -d' ' -f1)"
  for PKG in $PKGS; do
    pip_upgrade "$PKG"
    echo ''
  done
}

apt_search () {
  apt-cache --names-only search "^${PYTHON}-${1}$"
}

apt_install () {
  sudo apt-get install "${PYTHON}-${1}"
}

install () {
  if [ -n "$( apt_search "$1" )" ]; then
    apt_install "$1"
  else
    pip_install "$1"
  fi
}

apt_replace_pip_installed () {
  PKGS="$(pip_list_installed | cut -d' ' -f1)"
  for PKG in $PKGS; do
    if [ -n "$( apt_search "$PKG" )" ]; then
      apt_install "$PKG"
      pip_uninstall "$PKG"
      echo ''
    fi
  done
  pip_upgrade_installed
}

case "$1" in
 'pip-install')
  pip_install "$2"
  ;;
 'pip-upgrade')
  pip_upgrade "$2"
  ;;
 'pip-uninstall')
  pip_uninstall "$2"
  ;;
 'pip-list-installed')
  pip_list_installed
  ;;
 'pip-upgrade-installed')
  pip_upgrade_installed
  ;;
 'apt-search')
  apt_search "$2"
  ;;
 'apt-install')
  apt_install "$2"
  ;;
 'install')
  install "$2"
  ;;
 'apt-replace-pip-installed')
  apt_replace_pip_installed
  ;;
 *)
  print_usage
esac