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

set -eu

if [[ $# != 1 ]]; then
  echo "Usage: ${BASH_SOURCE[0]##*/} <evdi.deb>"
  exit 1
fi

files_exist()
{
  while [[ $# -gt 0 ]]; do
    [[ -e $1 ]] || return 1
    shift
  done
  return 0
}

to_realpath()
{
  echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
}

get_architecture()
{
  local deb="$1"

  dpkg-deb --info "$deb" | grep "Architecture" |  awk -F ':' '{print $2}' | xargs
}

validate_binary_architecture()
{
  local arch="$1"
  local binary="$2"
  local binary_arch=

  binary_arch=$(file "$binary" | awk -F ', ' '{print $2}')

  [[ "$arch" == "amd64" && "$binary_arch" != "x86-64" ]] && echo "$binary architecture $binary_arch does not match $arch" && false
  [[ "$arch" == "i386"  && "$binary_arch" != "Intel 80386"  ]] && echo "$binary architecture $binary_arch does not match $arch" && false
  [[ "$arch" == "arm64" && "$binary_arch" != "ARM aarch64"  ]] && echo "$binary architecture $binary_arch does not match $arch" && false
  [[ "$arch" == "armhf" && "$binary_arch" != "ARM"  ]] && echo "$binary architecture $binary_arch does not match $arch" && false

  true
}

lintian_check()
{
  local deb="$1"
  local ignore_list="$2"

  lintian "$deb" --no-tag-display-limit --suppress-tags-from-file "$ignore_list"
}

inspect_deb_contents()
{
  local deb=$1
  local ignore_list="$2"
  local arch=
  local temp_dir
  temp_dir=$(mktemp -d)
  arch=$(get_architecture "$deb")

  files=(
    "usr/src/evdi-$evdi_version"
    "usr/lib/libevdi.so.$evdi_version"
  )

  lintian_check "$deb" "$ignore_list" || (echo "Lintian found errors in the deb package" && false)

  (cd "$temp_dir"
      dpkg-deb -x "$deb" "$temp_dir"
      for f in "${files[@]}"
      do
          f="$temp_dir/$f"
          [[ -e "$f" ]] || (echo >&2 "Couldn't find file: $f" && exit 1)
      done

     validate_binary_architecture "$arch" "$temp_dir/usr/lib/libevdi.so.$evdi_version"
  )
  rm -rf "$temp_dir"
}

# shellcheck disable=SC1090
. "$(dirname "${BASH_SOURCE[0]}")/deb_config" || exit 1


inspect_deb_contents "$(to_realpath "$1")" "$(dirname "${BASH_SOURCE[0]}")/lintian.ignore"
echo "Evdi package $1 is OK!"

:
