#!/usr/bin/env bash

# SPDX-FileCopyrightText: 2021 Robin Vobruba <hoijui.quaero@gmail.com>
#
# SPDX-License-Identifier: Unlicense

# Exit immediately on each error and unset variable;
# see: https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/
set -Eeuo pipefail
#set -Eeu

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

function _is_win() {

  if [[ "$OSTYPE" == "cygwin" ]] \
      || [[ "$OSTYPE" == "msys" ]] \
      || [[ "$OSTYPE" == "win32" ]]
  then
    echo "true"
  else
    echo "false"
  fi
}

function _our_version() {

  if [ -n "${GITHUB_REF:-}" ]
  then
    # Apparently, this is the right way to get a tag name. Really?
    # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027
    echo -n "${GITHUB_REF#refs/tags/}"
  else
    repo_dir="${1:-.}"
    git \
      -C "$repo_dir" \
      describe \
      --long \
      --dirty \
      --candidates=99 \
      --always \
      --first-parent 2> /dev/null
  fi
}

var_names=()
set -a # All variables get exported when set, even without 'export' in front

# Application name
NAME="${NAME:-$(basename "$(pwd)")}"
var_names+=("NAME")

# Binary name
BINARY="${BINARY:-$NAME}"
var_names+=("BINARY")

# Our version
OUR_VERSION="${OUR_VERSION:-$(_our_version)}"
var_names+=("OUR_VERSION")
VERSION="$OUR_VERSION"
var_names+=("VERSION")

# Target sppecifics (arch, os, base-lib, ...)
TARGET="${TARGET:-}"
var_names+=("TARGET")

# Operating system (rust target string)
OS="${OS:-}"
var_names+=("OS")

# Environment file
ENV_FILE="${ENV_FILE:-${GITHUB_ENV:-}}"
var_names+=("ENV_FILE")

# The cargo executable name (might be `cargo` or `cross`)
CARGO="${CARGO:-cargo}"
var_names+=("CARGO")

# When CARGO is set to CROSS, this is set to `--target matrix.target`.
TARGET_FLAGS="${TARGET_FLAGS:-}"
var_names+=("TARGET_FLAGS")

# Emit backtraces on panics.
RUST_BACKTRACE=1
var_names+=("RUST_BACKTRACE")

if [ -n "$OS" ]
then
  IS_WIN="$([ "$OS" = "windows-2019" ] && echo -n "true" || echo -n "false")"
else
  IS_WIN="${IS_WIN:-$(_is_win)}"
fi
var_names+=("IS_WIN")

STAGING="./target/$NAME-$VERSION"
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
TARGET_DIR="./target"
if [ -n "$TARGET" ]
then
  #TARGET="$OSTYPE-$(uname -m)"
  STAGING="$STAGING-$TARGET"
  if [ "$CARGO" = "cross" ]
  then
    TARGET_DIR="$TARGET_DIR/$TARGET"
  fi
fi
var_names+=("STAGING")
var_names+=("TARGET_DIR")

if $IS_WIN
then
  BINARY="${BINARY}.exe"
fi
BINARY_DIR="$TARGET_DIR/release"
BINARY_PATH="$BINARY_DIR/$BINARY"
var_names+=("BINARY_DIR")
var_names+=("BINARY_PATH")

if $IS_WIN
then
  PACKAGE_ARCHIVE="${STAGING}.zip"
else
  PACKAGE_ARCHIVE="${STAGING}.tar.gz"
fi
var_names+=("PACKAGE_ARCHIVE")

for var_name in "${var_names[@]}"
do
  echo "$var_name=${!var_name}"
  if [ -n "$ENV_FILE" ]
  then
    echo "$var_name=${!var_name}" >> "$ENV_FILE"
  fi
done

set +a
