#!/bin/bash

## Copyright (C) 2024 - 2024 ENCRYPTED SUPPORT LP <adrelanos@whonix.org>
## See the file COPYING for copying conditions.

## Usage:
## dummy-dependency [-y|--yes] 'package-name'

#set -x
set -e
set -o errtrace
set -o pipefail
set -o nounset

true "$0: INFO: START"

show_usage() {
   echo "Usage: $0 [-y|--yes] 'package-name'" >&2
   exit 1
}

yes_option=""
if [ "$#" -gt 1 ]; then
   case "$1" in
      -y|--yes)
         yes_option="--yes"
         shift
         ;;
      *)
         show_usage
         ;;
   esac
fi

cleanup() {
   if [ -n "${TMPDIR_NEW:-}" ] && [ -d "${TMPDIR_NEW}" ]; then
      safe-rm -r -f "${TMPDIR_NEW}"
   fi
}

root_check() {
   if [ "$(id -u)" -ne 0 ]; then
      echo "FATAL ERROR: This script must be run as root." >&2
      exit 1
   fi
}

trap cleanup EXIT

dummy_dependency() {
   local equivs_file deb_file equivs_content equivs_build_log

   root_check

   # Validate package name, see
   # https://www.debian.org/doc/debian-policy/ch-controlfields.html#source
   if ! grep --quiet '^[a-z0-9]\+[a-z0-9+-.]\+$' -- <<< "${package_to_replace}" ; then
      echo 'FATAL ERROR: Package name is invalid, check for typos' >&2
      exit 1
   fi

   if [ -z "${TMPDIR:-}" ]; then
      echo 'FATAL ERROR: TMPDIR is unset.' >&2
      exit 1
   fi

   ## ${TMPDIR} is an already existing environment variable.
   TMPDIR_OLD="${TMPDIR}"

   TMPDIR_NEW="$(mktemp --directory)"

   ## equivs-build uses ${TMPDIR} for builds
   TMPDIR="${TMPDIR_NEW}"
   export TMPDIR

   equivs_file="${TMPDIR_NEW}/${package_to_replace}.equivs"
   ## equivs-build uses ${TMPDIR} for builds
   deb_file="${TMPDIR_NEW}/dummy-${package_to_replace}_99_all.deb"

   echo "Creating dummy replacement for '${package_to_replace}'..."

   equivs_content="Package: dummy-${package_to_replace}
Version: 99:99
Maintainer: dummy-dependency script <dummy-dependency@dummy-dependency.invalid>
Breaks: ${package_to_replace}
Replaces: ${package_to_replace}
Provides: ${package_to_replace}
Architecture: all
Description: dummy-package for '${package_to_replace}'
 A metapackage that replaces '${package_to_replace}'."

   echo "${equivs_content}" | sponge -- "${equivs_file}"

   if ! equivs_build_log="$(equivs-build -- "${equivs_file}" 2>&1)" ; then
      echo "FATAL ERROR: 'equivs-build -- \"${equivs_file}\"' command failed!" >&2
      echo 'Logs:' >&2
      echo "${equivs_build_log}" >&2
      exit 1
   fi

   ## Reset to previously set TMPDIR.
   TMPDIR="${TMPDIR_OLD}"

   echo 'Dummy package created. Installing...'

   test -r "${deb_file}"

   #lintian --pedantic --info --display-info "${deb_file}"

   echo "apt-get $yes_option install -- ${deb_file}"
   if ! apt-get $yes_option install -- "${deb_file}" ; then
      echo 'FATAL ERROR: apt-get install command failed!' >&2
      exit 1
   fi
   echo 'Dummy package installed.'

   cleanup
   trap '' EXIT
   true "$0: INFO: END"
   exit 0
}

## Main execution
if [ "$#" -lt '1' ]; then
   show_usage
fi

## Declare global variables
TMPDIR_OLD=''
TMPDIR_NEW=''
package_to_replace="${1:-}"

dummy_dependency
