#!/usr/bin/env bash
###############################################################################
# BRLTTY - A background process providing access to the console screen (when in
#          text mode) for a blind person using a refreshable braille display.
#
# Copyright (C) 1995-2023 by The BRLTTY Developers.
#
# BRLTTY comes with ABSOLUTELY NO WARRANTY.
#
# This is free software, placed under the terms of the
# GNU Lesser General Public License, as published by the Free Software
# Foundation; either version 2.1 of the License, or (at your option) any
# later version. Please see the file LICENSE-LGPL for details.
#
# Web Page: http://brltty.app/
#
# This software is maintained by Dave Mielke <dave@mielke.cc>.
###############################################################################

. "$(dirname "${0}")/../brltty-prologue.sh"

processExtraProgramParameters() {
   requiredPackageNames=( "${@}" )
}

addProgramOption i flag installNeededPackages "install the needed packages"
addProgramOption l flag listNeededPackages "list the needed packages"
optionalProgramParameters
parseProgramArguments "${@}"

set -e
. "${programDirectory}/packages.sh"

[ "${#requiredPackageNames[@]}" -gt 0 ] || {
   loadRequiredPackageNames() {
      local file="${programDirectory}/${programName}.d/${platformName}"
      [ -e "${file}" ] || semanticError "platform package list not found: ${file}"
      [ -f "${file}" ] || semanticError "not a file: ${file}"
      [ -r "${file}" ] || semanticError "platform package list not readable: ${file}"

      local name
      while read name
      do
         [ -n "${name}" ] || continue
         [ "${name:0:1}" = "#" ] && continue
         requiredPackageNames[${#requiredPackageNames[*]}]="${name}"
      done < <(cat "${file}")

      [ "${#requiredPackageNames[@]}" -gt 0 ] || semanticError "empty package list"
   }

   case "${packageManager}"
   in
      apk)
         platformName="alpine"
         ;;

      apt)
         if [ "$(uname -s)" = "GNU" ]
         then
            platformName="hurd"
         else
            platformName="debian"
         fi
         ;;

      brew)
         platformName="darwin"
         ;;

      dnf)
         platformName="fedora"
         ;;

      pacman)
         platformName="arch"
         ;;

      pkg)
         platformName="freebsd"
         ;;

      pkg_info)
         platformName="openbsd"
         ;;

      xbps)
         platformName="void"
         ;;

      zypper)
         platformName="opensuse"
         ;;

      *) semanticError "unknown host platform: ${packageManager}";;
   esac

   logNote "platform name: ${platformName}"
   loadRequiredPackageNames
}

listRequiredPackages() {
   local name

   for name in "${requiredPackageNames[@]}"
   do
      echo "${name}"
   done
}

neededPackages=(
   $(
      diff <(listInstalledPackages | normalizePackageList) \
           <(listRequiredPackages | normalizePackageList) |
      sed -n -e '
         /^--- /b
         /^+++ /b
         s/^+/> /
	 s/^> //p
      '
   )
)

if [ "${#neededPackages[@]}" -gt 0 ]
then
   logMessage task "packages needed: ${#neededPackages[@]}"

   "${listNeededPackages}" && {
      for package in "${neededPackages[@]}"
      do
         echo "${package}"
      done
   }

   "${installNeededPackages}" && {
      installPackages "${neededPackages[@]}"
   }
else
   logMessage task "no needed packages"
fi

exit 0
