#!/usr/bin/env bash
# vim:et:ts=2:sts=2:sw=2

# Get absolute repository root (especially when symlinked)
ROOT="$(realpath "$(dirname "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")")")"

# Load accompanying bash library
source "$ROOT/lib/lib.bash"

set -e

# Check git status
say "Confirming git status"
run git fetch
if git status -sb | grep -q 'behind'; then
  say "Pulling changes from upstream..."
  run git pull
fi

# Check dependencies
say "Checking dependencies"
for cmd in tar sha256sum rsync git; do
  if ! command -v "$cmd" &>/dev/null; then
    err "$cmd could not be found"
  fi
done

# Confirm SSH access
say "Checking SSH connection to bastion.techlitafrica.org"
if ! ssh -q -o BatchMode=yes -o ConnectTimeout=5 bastion exit; then
  err "Cannot connect to admin@bastion.techlitafrica.org"
  exit 1
fi

# Versioning
VERSION="$1"
if [ -z "$VERSION" ]; then
  say "No tag provided, auto-tagging..."
  LATEST_TAG=$(git tag -l | sort -V | tail -n1)
  if [ -z "$LATEST_TAG" ]; then
    VERSION="0.1.0"
  else
    VERSION=$(echo "$LATEST_TAG" | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g')
  fi
  say "New version: $VERSION"
  run git tag "$VERSION" -m "Release $VERSION"
  say "Pushing new tag to origin"
  run git push
  run git push --tags
else
  say "Using provided tag: $VERSION"
  if ! git rev-parse "$VERSION" >/dev/null 2>&1; then
    err "Tag $VERSION not found locally. Make sure to fetch tags."
  fi
  LATEST_TAG=$(git tag -l | sort -V | grep -B1 "$VERSION" | head -n1)
fi

# Create tarball
TMPDIR=$(mktemp -d)
trap 'rm -rf -- "$TMPDIR"' EXIT

PACKAGE_DIR="$TMPDIR/package"
ARCHIVE_FILE="$TMPDIR/v$VERSION.tar.gz"
CHECKSUM_FILE="$TMPDIR/v$VERSION.sha256"

say "Creating package for version $VERSION in $TMPDIR"
run mkdir -p "$PACKAGE_DIR"

# Archive repo contents directly into the working dir
say "Archiving repository content"
run git archive "$VERSION" | tar -x -C "$PACKAGE_DIR"

# Create changelog and version files
say "Generating changelog and version file"
echo "$VERSION" >"$PACKAGE_DIR/.version"
{
  echo "Version $VERSION"
  if [ -n "$LATEST_TAG" ]; then
    git --no-pager log --pretty=format:'- %s (%an)' "$LATEST_TAG..$VERSION"
  else
    git --no-pager log --pretty=format:'- %s (%an)' "$VERSION"
  fi
} >"$PACKAGE_DIR/.changelog"

say "Creating tarball and checksum"
run tar -czf "$ARCHIVE_FILE" -C "$PACKAGE_DIR" .

(cd "$TMPDIR" && sha256sum "v$VERSION.tar.gz" >"v$VERSION.sha256")

say "Uploading release to bastion.techlitafrica.org"
run rsync -avz "$ARCHIVE_FILE" "$CHECKSUM_FILE" "admin@bastion.techlitafrica.org:/srv/admin/"

say "Deployment of $VERSION complete."
