#!/usr/bin/env bash
# Copyright (c) 2022 DisplayLink (UK) Ltd.

set -eu

if [[ ! $# -eq 2 ]]; then
  echo "Usage: ${BASH_SOURCE[0]##*/} <arch> <debian_revision>"
  exit 1
fi

readonly evdi_arch=${1:?}
readonly debian_revision=${2:?}

export_CC_flag_with_proper_compiler()
{
  [[ ${CC+x} ]] && return

  case $evdi_arch in
  amd64)
  export CC=gcc
  ;;
  armhf)
  export CC=arm-linux-gnueabihf-gcc
  ;;
  arm64)
  export CC=aarch64-linux-gnu-gcc
  ;;
  esac
}

build_libevdi()
{
  (
    export_CC_flag_with_proper_compiler
    make -C library clean default
  )
}

create_evdi_deb_package()
{
  local temp_dir
  temp_dir=$(mktemp -d)

  local repo_dir="$1"
  local deb_dir="$temp_dir/EVDI"
  local control_dir="$deb_dir/DEBIAN"
  local docs_dir="$deb_dir/usr/share/doc/$evdi_package_name"
  local libevdi_abi

  libevdi_abi=$(echo "$evdi_version" | cut -d. -f1)
  mkdir -p \
      "$control_dir" \
      "$deb_dir/usr/src" \
      "$deb_dir/var/log/displaylink" \
      "$docs_dir" \
      "$deb_dir"/etc/{modules-load,modprobe}.d

  (
    cd "$repo_dir"

    git archive --format tar HEAD module | (cd "$temp_dir" && tar xf -)

    if ! mv "$temp_dir/module" "$deb_dir/usr/src/evdi-$evdi_version"; then
      echo >&2 "Failed to move evdi module sources"
      rm -rf "$temp_dir"
      return 1
    fi

    if ! build_libevdi; then
      echo >&2 "Failed to build evdi library"
      rm -rf "$temp_dir"
      return 1
    fi

    if ! install -Dm 644 library/libevdi.so "$deb_dir/usr/lib/libevdi.so.$evdi_version"; then
      echo >&2 "Failed to copy evdi library"
      rm -rf "$temp_dir"
      return 1
    else
    (
      local major_version=${evdi_version%%.*}
      cd "$deb_dir/usr/lib/"
      ln -s "libevdi.so.$evdi_version" \
           "libevdi.so"
      ln -s "libevdi.so.$evdi_version" \
          "libevdi.so.$major_version"
    )
    fi
    if ! install -m 644 library/LICENSE "$docs_dir/copyright"; then
      echo >&2 "Failed to copy library LICENSE"
      rm -rf "$temp_dir"
      return 1
    fi
  )

  cat > "$control_dir/control" << EOF
Package: evdi
Provides: evdi-dkms (=$evdi_version), libevdi1 (=$evdi_version)
Version: $evdi_version-$debian_revision
Maintainer: $evdi_maintainer
Source: evdi
Section: kernel
Depends: mokutil, dkms
Conflicts: libevdi${libevdi_abi}, libevdi${libevdi_abi}-dev, evdi-dkms
Architecture: $evdi_arch
Priority: optional
Description: $evdi_description
EOF

  cat > "$control_dir/preinst" << EOF
#!/bin/bash

displaylink_installer_exists()
{
  [[ \$(command -v displaylink-installer) ]]
}

evdi_installed_via_standalone_run_installer()
{
  [[ -e /opt/displaylink/evdi.tar.gz ]]
}

if evdi_installed_via_standalone_run_installer; then
  if displaylink_installer_exists; then
    echo "evdi installed via standalone installer: uninstalling..."
    displaylink-installer uninstall
  else
    echo >&2 "ERROR: evdi installed via standalone installer but displaylink-installer script does not exists."
    exit 1
  fi
fi
EOF

  cat > "$control_dir/postinst" << EOF
#!/bin/bash

if [[ \$1 == configure ]]; then
  /usr/src/evdi-$evdi_version/dkms_install.sh
fi
EOF

  cat > "$control_dir/prerm" << EOF
#!/bin/bash

dkms remove 'evdi/$evdi_version' --all
rm -f /etc/{modprobe,modules-load}.d/evdi.conf
EOF

  cat > "$control_dir/postrm" << 'EOF'
#!/bin/bash

if [ \${DISPLAYLINK_DEBUG_DEV:-"no"} == "yes" ]; then
  set -e
fi

if [[ $1 == purge ]]; then
  rm -rf /var/log/displaylink
fi
EOF

  chmod 0755 "$control_dir"/{pre,post}{rm,inst}

  (
    cd "$temp_dir"
    fakeroot dpkg-deb --build EVDI
  )

  mv "$temp_dir/EVDI.deb" "evdi-${evdi_version}-${debian_revision}_${evdi_arch}.deb"

  rm -rf "$temp_dir"
}

script_dir="$(dirname "${BASH_SOURCE[0]}")"

evdi_package_name=
evdi_version=
evdi_description=
evdi_maintainer=
# shellcheck disable=SC1090
. "$script_dir/deb_config" || exit 1


: "${evdi_maintainer:?}" "${evdi_description:?}" "${evdi_version:?}"

create_evdi_deb_package "$script_dir/.."

